#include "ribbon.h" #include Ribbon::Ribbon(QMainWindow * parent_): QToolBar() { delay_e = true; delay = 1000; hovered = -1; setObjectName("ribbon"); setProperty("ribbon", true); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); parent = parent_; if (parent_) parent_->installEventFilter(this); init(); } Ribbon::~Ribbon() { } bool Ribbon::eventFilter(QObject * o, QEvent * e) { if (o == parent) { if (e->type() == QEvent::Resize || e->type() == QEvent::WindowActivate) _resize(); return QToolBar::eventFilter(o, e); } if (e->type() == QEvent::ActionChanged) { QToolButton * b = qobject_cast((QObject * )o->property("ribbonButton").toLongLong()); if (b != 0) b->setEnabled(qobject_cast(o)->isEnabled()); } return QToolBar::eventFilter(o, e); } void Ribbon::timerEvent(QTimerEvent * e) { if (hovers.value(e->timerId(), -1) == hovered) tab->setCurrentIndex(hovered); hovers.remove(e->timerId()); killTimer(e->timerId()); } void Ribbon::_resize() { return; // WARNING for (int i = 0; i < tab->count(); ++i) { int h = ((QScrollArea*)(tab->widget(i)))->sizeHint().height(); if (((QScrollArea*)(tab->widget(i)))->horizontalScrollBar()->isVisible()) h += ((QScrollArea*)(tab->widget(i)))->horizontalScrollBar()->height(); ((QScrollArea*)(tab->widget(i)))->setMinimumHeight(h); } } void Ribbon::setVisible(bool yes) { QToolBar::setVisible(yes); if (parent == 0) return; if (parent->menuBar() == 0) return; parent->menuBar()->setVisible(!yes); } void Ribbon::init() { if (parent == 0) return; if (parent->menuBar() == 0) return; QList lm = parent->menuBar()->actions(), la; tab = new ETabWidget(); tab->setObjectName("ribbon_tab_widget"); connect(tab, SIGNAL(tabHovered(int)), this, SLOT(tabHovered(int))); connect(tab, SIGNAL(currentChanged(int)), this, SIGNAL(currentTabChanged(int))); tab->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QGroupBox * g; QBoxLayout * l, * tl; QToolButton * b; //tab->setIconSize(QSize(32, 32)); foreach (QAction * i, lm) { if (i->menu() == 0) continue; la = i->menu()->actions(); tab->addTab(new QWidget(), i->icon(), i->text()); /*QScrollArea * sa = new QScrollArea(); sa->setWidget(new QWidget()); sa->setWidgetResizable(true); sa->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); sa->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); sa->setFrameShape(QFrame::NoFrame); tab->addTab(sa, i->icon(), i->text());*/ tab->widget(tab->count() - 1)->setProperty("ribbonAction", qlonglong((void * )i)); i->setIcon(QIcon()); tl = new QBoxLayout(QBoxLayout::LeftToRight); tl->setSpacing(2); tl->setContentsMargins(2, 2, 2, 2); g = new QGroupBox(); l = new QBoxLayout(QBoxLayout::LeftToRight); g->setLayout(l); l->setSpacing(2); l->setContentsMargins(2, 2, 2, 2); foreach (QAction * j, la) { if (j->isSeparator()) { if (l->isEmpty()) continue; tl->addWidget(g); g = new QGroupBox(); l = new QBoxLayout(QBoxLayout::LeftToRight); l->setSpacing(2); l->setContentsMargins(2, 2, 2, 2); g->setLayout(l); continue; } if (qobject_cast(j)) { QWidget * _w = qobject_cast(j)->defaultWidget(); l->addWidget(_w); _w->show(); continue; } b = new QToolButton(); b->setEnabled(j->isEnabled()); b->setProperty("ribbonAction", qlonglong((void * )j)); j->setProperty("ribbonButton", qlonglong((void * )b)); j->installEventFilter(this); if (j->menu() != 0) { b->setPopupMode(QToolButton::InstantPopup); b->setMenu(j->menu()); } else { b->setCheckable(j->isCheckable()); if (b->isCheckable()) { b->setChecked(j->isChecked()); connect(b, SIGNAL(toggled(bool)), j, SLOT(setChecked(bool))); connect(j, SIGNAL(toggled(bool)), b, SLOT(setChecked(bool))); } else connect(b, SIGNAL(clicked()), j, SLOT(trigger())); } //b->setIconSize(QSize(16, 16)); b->setIcon(j->icon()); b->setText(j->text()); //b->setToolTip(j->toolTip()); //b->addAction(j); //b->setShortcut(j->shortcut()); b->setAutoRaise(true); b->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); b->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); buttons << b; l->addWidget(b); } tl->addWidget(g); tl->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Fixed)); //sa->widget()->setLayout(tl); tab->widget(tab->count() - 1)->setLayout(tl); } setFloatable(false); setMovable(false); scroll_area = new QScrollArea(); scroll_area->setFrameShape(QFrame::NoFrame); scroll_area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scroll_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); scroll_area->setWidget(tab); _resize(); //addWidget(scroll_area); addWidget(tab); parent->addToolBar(Qt::TopToolBarArea, this); parent->menuBar()->hide(); tab->setAutoFillBackground(false); } void Ribbon::retranslate() { QAction * a; foreach (QToolButton * i, buttons) { a = (QAction * )(i->property("ribbonAction").toLongLong()); if (a == 0) continue; i->setText(a->text()); i->setToolTip(a->toolTip()); //i->setShortcut(a->shortcut()); } for (int i = 0; i < tab->count(); ++i) { a = (QAction * )(tab->widget(i)->property("ribbonAction").toLongLong()); if (a == 0) continue; tab->setTabText(i, a->text()); } _resize(); } void Ribbon::setIconSize(const QSize & size) { foreach (QToolButton * i, buttons) i->setIconSize(size); _resize(); } void Ribbon::setTabIconSize(const QSize & size) { tab->setIconSize(size); _resize(); }