#include "lts_tab_bar.h" #include "lts_dialog.h" #include "lts_dialog_helper.h" #include "lts_events.h" #include "lts_tab_widget.h" #include #include #include namespace LtsWidgets { LtsTabBar::LtsTabBar(bool isSecondary, QWidget *parent) : QTabBar(parent) , m_secondary(isSecondary) { setDocumentMode(true); setTabsClosable(true); connect(this, &LtsTabBar::currentChanged, this, &LtsTabBar::updateCloseButtonColors); if (m_secondary) { connect(this, &LtsTabBar::customContextMenuRequested, this, &LtsTabBar::onCustomContextMenuRequested); setContextMenuPolicy(Qt::CustomContextMenu); } } void LtsTabBar::_internal_closeTab() { QObject *object = sender(); int tabToClose = -1; for (int i = 0; i < count(); i++) { if (tabButton(i, QTabBar::RightSide) == object) { tabToClose = i; break; } } if (tabToClose != -1) emit tabCloseRequested(tabToClose); } void LtsTabBar::updateCloseButtonColors(int newIndex) { if (newIndex == -1) newIndex = currentIndex(); for (int i = 0; i < count(); i++) { QWidget *w = tabButton(i, QTabBar::RightSide); CloseButton *cb = qobject_cast(w); if (!cb) continue; QColor text; bool enabled = isTabEnabled(i); bool selected = (i == newIndex); bool secondary = m_secondary; if (enabled) { if (selected) text = (secondary) ? Styles::TabBarTabStyle::secondarySelected : Styles::TabBarTabStyle::primarySelected; else text = (secondary) ? Styles::TabBarTabStyle::secondaryNormal : Styles::TabBarTabStyle::primaryNormal; } else text = (secondary) ? Styles::TabBarTabStyle::secondaryDisabled : Styles::TabBarTabStyle::primaryDisabled; cb->setFontColor(text); } } void LtsTabBar::onCustomContextMenuRequested(const QPoint pos) { if (!m_secondary) return; QMenu m; QAction *a = new QAction(tr("Save as image")); connect(a, &QAction::triggered, this, [this, pos]() { LtsTabBar::onSaveCurrentWidgetAsImage(pos); }); m.addAction(a); m.exec(mapToGlobal(pos)); } void LtsTabBar::onSaveCurrentWidgetAsImage(const QPoint pos) { int curTab = tabAt(pos); if (curTab < 0) curTab = currentIndex(); if (curTab < 0) return; LtsTabWidget *tw = qobject_cast(parentWidget()); QWidget *w = tw ? tw->widget(curTab) : nullptr; if (!w) return; LtsDialogHelper *helper = qobject_cast(w); if (helper) w = helper->getDialog(); SaveImageEvent *ev = new SaveImageEvent(w, w->grab()); ev->setAccepted(false); QCoreApplication::postEvent(qApp, ev); } }