#include "ngldialogbuttonbox.h" #include #include #include NGLDialogButtonBox::NGLDialogButtonBox(QWidget *parent) : NGLDialogButtonBox(Qt::Horizontal, parent) {} NGLDialogButtonBox::NGLDialogButtonBox(Qt::Orientation orientation, QWidget *parent) : QWidget(parent) , m_orientation(orientation) , m_buttons(NGLStandardButton::NoButton) , m_line(nullptr) , m_bSpacer2ContextAction(nullptr) , m_bLineVisible(true) { setFocusPolicy(Qt::StrongFocus); init(); } NGLDialogButtonBox::NGLDialogButtonBox(NGLStandardButton::StandardButtons buttons, Qt::Orientation orientation, QWidget *parent) : QWidget(parent) , m_orientation(orientation) , m_buttons(buttons) , m_line(nullptr) , m_bSpacer2ContextAction(nullptr) , m_bLineVisible(true) { setFocusPolicy(Qt::StrongFocus); setStandardButtons(m_buttons); } Qt::Orientation NGLDialogButtonBox::orientation() const { return m_orientation; } void NGLDialogButtonBox::setOrientation(Qt::Orientation orientation) { if (m_orientation == orientation) return; m_orientation = orientation; init(); } NGLStandardButton::StandardButtons NGLDialogButtonBox::standardButtons() const { return m_buttons; } void NGLDialogButtonBox::setStandardButtons(NGLStandardButton::StandardButtons buttons) { m_buttons = buttons; QMultiMap::const_iterator it = m_standardButtons.constBegin(); QMultiMap::const_iterator end = m_standardButtons.constEnd(); for (; it != end; ++it) { const QList actions = it.value()->actions(); for (QAction *a : actions) removeAction(a); delete it.value(); } m_standardButtons.clear(); NGLStandardButton::StandardButton i = NGLStandardButton::FirstButton; while (i <= NGLStandardButton::LastButton) { if ((m_buttons & i) == i) { NGLStandardButton *button = new NGLStandardButton(i); addButtonInternal(button); if (i == NGLStandardButton::Ok) { button->setDefault(true); button->setAutoDefault(true); } } i = (NGLStandardButton::StandardButton)((int) i << 1); } init(); } void NGLDialogButtonBox::addButtonInternal(NGLStandardButton *button) { button->setParent(this); button->setDefault(false); button->setAutoDefault(false); m_standardButtons.insert(button->layoutPriority(), button); } void NGLDialogButtonBox::addButton(NGLStandardButton *button) { addButtonInternal(button); init(); } NGLStandardButton *NGLDialogButtonBox::addButton(NGLStandardButton::StandardButton button) { NGLStandardButton *pb = new NGLStandardButton(button); addButton(pb); return pb; } NGLStandardButton *NGLDialogButtonBox::button(NGLStandardButton::StandardButton button) { QMultiMap::const_iterator it = m_standardButtons.constBegin(); QMultiMap::const_iterator end = m_standardButtons.constEnd(); for (; it != end; ++it) { if (it.value()->type() == button) return it.value(); } return new NGLStandardButton(nullptr); } void NGLDialogButtonBox::removeFromActionList(NGLStandardButton::StandardButton button) { m_disabledActions |= button; init(); } bool NGLDialogButtonBox::setEnabled(NGLStandardButton::StandardButton button, bool enable) { NGLStandardButton *b = this->button(button); if (!b) return false; b->setEnabled(enable); return true; } bool NGLDialogButtonBox::isEnabled(NGLStandardButton::StandardButton button) { NGLStandardButton *b = this->button(button); if (!b) return false; return b->isEnabled(); } bool NGLDialogButtonBox::lineVisible() const { return m_bLineVisible; } void NGLDialogButtonBox::setLineVisible(bool bVisible) { if (m_bLineVisible == bVisible) return; m_bLineVisible = bVisible; init(); } bool NGLDialogButtonBox::setVisible(NGLStandardButton::StandardButton button, bool visible) { NGLStandardButton *b = this->button(button); if (!b) return false; b->setVisible(visible); return true; } void NGLDialogButtonBox::layoutPriorityChanged() { QMultiMap standardButtons = m_standardButtons; m_standardButtons.clear(); QMultiMap::const_iterator it = standardButtons.constBegin(); QMultiMap::const_iterator end = standardButtons.constEnd(); for (; it != end; ++it) { NGLStandardButton *button = it.value(); m_standardButtons.insert(button->layoutPriority(), button); } init(); } static void addSpacer2(QLayout *l, Qt::Orientation orientation) { if (orientation == Qt::Horizontal) l->addItem(new QSpacerItem(20, 1, QSizePolicy::MinimumExpanding, QSizePolicy::Fixed)); else l->addItem(new QSpacerItem(1, 20, QSizePolicy::Fixed, QSizePolicy::MinimumExpanding)); } void NGLDialogButtonBox::init() { delete layout(); delete m_line; m_line = nullptr; if (m_bSpacer2ContextAction) { removeAction(m_bSpacer2ContextAction); delete m_bSpacer2ContextAction; m_bSpacer2ContextAction = nullptr; } QBoxLayout *l; QBoxLayout *lMain; if (m_orientation == Qt::Horizontal) { lMain = new QVBoxLayout; l = new QHBoxLayout; } else { lMain = new QHBoxLayout; l = new QVBoxLayout; } lMain->setContentsMargins(0,0,0,0); if (m_bLineVisible) { m_line = new QFrame(this); m_line->setFrameShape(m_orientation == Qt::Horizontal ? QFrame::HLine : QFrame::VLine); m_line->setFrameShadow(QFrame::Sunken); lMain->addWidget(m_line); } lMain->addLayout(l); l->setDirection(m_orientation == Qt::Horizontal ? QBoxLayout::RightToLeft : QBoxLayout::BottomToTop); l->setContentsMargins(0, 0, 0, 0); setLayout(lMain); const auto actions = findChildren(); for (auto a : actions) a->disconnect(a, &QAction::triggered, this, &NGLDialogButtonBox::buttonClicked); bool bLowestPrioButton = false; bool bSpacer1Added = false; bool bSpacer2Added = false; QMultiMap::const_iterator it = m_standardButtons.constBegin(); QMultiMap::const_iterator end = m_standardButtons.constEnd(); for (; it != end; ++it) { qint32 prio = it.key(); NGLStandardButton *button = it.value(); if (prio < 30) bLowestPrioButton = true; if (prio >= 30 && !bSpacer1Added) { bSpacer1Added = true; if (bLowestPrioButton) { QSpacerItem *item = new QSpacerItem(7, 7, QSizePolicy::Fixed, QSizePolicy::Fixed); l->addItem(item); } } if (prio >= 100 && !bSpacer2Added) { bSpacer2Added = true; addSpacer2(l, m_orientation); } if (prio >= 30 && prio < 100) { const QList actions = button->actions(); for (QAction *a : actions) removeAction(a); if ((m_disabledActions & button->type()) == 0) { if (prio >= 100 && !m_bSpacer2ContextAction) { m_bSpacer2ContextAction = new QAction(this); m_bSpacer2ContextAction->setSeparator(true); addAction(m_bSpacer2ContextAction); } addActions(actions); } } l->addWidget(button); if (button->type() == NGLStandardButton::Library) { QAction *ex = button->findChild(QLatin1String("actionExport")); if (ex) { connect(ex, &QAction::triggered, this, &NGLDialogButtonBox::buttonClicked, Qt::UniqueConnection); } QAction *im = button->findChild(QLatin1String("actionImport")); if (im) { connect(im, &QAction::triggered, this, &NGLDialogButtonBox::buttonClicked, Qt::UniqueConnection); } } else { connect(button, &NGLStandardButton::clicked, this, &NGLDialogButtonBox::buttonClicked, Qt::UniqueConnection); } } if (!bSpacer2Added) addSpacer2(l, m_orientation); QMultiMapIterator mapIt(m_standardButtons); NGLStandardButton *prevButton = nullptr; mapIt.toBack(); while (mapIt.hasPrevious()) { NGLStandardButton *curButton = mapIt.previous().value(); if (prevButton != nullptr) setTabOrder(prevButton, curButton); prevButton = curButton; } } void NGLDialogButtonBox::buttonClicked() { NGLStandardButton *b = qobject_cast (sender()); if (!b) { QAction *a = qobject_cast (sender()); if (!a) return; if (a->objectName() == QLatin1String("actionExport")) { emit onLibraryExport(); return; } if (a->objectName() == QLatin1String("actionImport")) { emit onLibraryImport(); return; } return; } switch (b->type()) { case NGLStandardButton::Ok: emit onOk(); break; case NGLStandardButton::Send: emit onSend(); break; case NGLStandardButton::New: emit onNew(); break; case NGLStandardButton::Delete: emit onDelete(); break; case NGLStandardButton::Save: emit onSave(); break; case NGLStandardButton::Open: emit onOpen(); break; case NGLStandardButton::Yes: emit onYes(); break; case NGLStandardButton::No: emit onNo(); break; case NGLStandardButton::Close: emit onClose(); break; case NGLStandardButton::Cancel: emit onCancel(); break; case NGLStandardButton::Help: emit onHelp(); break; case NGLStandardButton::Apply: emit onApply(); break; case NGLStandardButton::Reset: emit onReset(); break; case NGLStandardButton::Print: emit onPrint(); break; case NGLStandardButton::Modify: emit onModify(); break; case NGLStandardButton::Add: emit onAdd(); break; case NGLStandardButton::Remove: emit onRemove(); break; case NGLStandardButton::Edit: emit onEdit(); break; case NGLStandardButton::Download: emit onDownload(); break; case NGLStandardButton::Library: break; case NGLStandardButton::Show: emit onShow(); break; case NGLStandardButton::ZoomIn: emit onZoomIn(); break; case NGLStandardButton::ZoomOut: emit onZoomOut(); break; case NGLStandardButton::Hide: emit onHide(); break; default: emit clicked(b); break; } } void NGLDialogButtonBox::enableImport(bool ena) { NGLStandardButton *b = button(NGLStandardButton::Library); if (!b) return; QAction *im = b->findChild(QLatin1String("actionImport")); if (im) { im->setEnabled(ena); QAction *ex = b->findChild(QLatin1String("actionExport")); if (ex) b->setEnabled(ena || ex->isEnabled()); } } void NGLDialogButtonBox::enableExport(bool ena) { NGLStandardButton *b = button(NGLStandardButton::Library); if (!b) return; QAction *ex = b->findChild(QLatin1String("actionExport")); if (ex) { ex->setEnabled(ena); QAction *im = b->findChild(QLatin1String("actionImport")); if (im) b->setEnabled(ena || im->isEnabled()); } }