File indexing completed on 2022-11-29 18:26:12

0001 #include <QLayout>
0002 #include <QKeyEvent>
0003 #include <QMenu>
0004 #include <QMimeData>
0005 #include <QDrag>
0006 #include <qinputdialog.h>
0007 #include <QBoxLayout>
0008 #include <QApplication>
0009 
0010 #include <kdebug.h>
0011 #include <kiconloader.h>
0012 
0013 #include "ktabwidgettest.h"
0014 
0015 Test::Test(QWidget *parent)
0016     : QWidget(parent), mChange(0), mLeftWidget(nullptr), mRightWidget(nullptr),
0017       mLeftPopup(nullptr), mRightPopup(nullptr), mTabbarContextPopup(nullptr), mContextPopup(nullptr)
0018 
0019 {
0020     resize(600, 300);
0021 
0022     QVBoxLayout *topLayout = new QVBoxLayout(this);
0023     topLayout->setContentsMargins(0, 0, 0, 0);
0024     topLayout->setSpacing(0);
0025 
0026     mWidget = new KTabWidget(this);
0027     mWidget->addTab(new QLabel("Testlabel 1", nullptr), "&One");
0028     mWidget->addTab(new QLabel("Testlabel 2", nullptr), "Two");
0029     mWidget->addTab(new QWidget(), SmallIcon("konsole"), "Three");
0030     mWidget->addTab(new QWidget(), "Four");
0031     mWidget->setTabTextColor(0, Qt::red);
0032     mWidget->setTabTextColor(1, Qt::blue);
0033     mWidget->setUsesScrollButtons(false);   // corresponding checkbox is unchecked by default
0034 
0035     connect(mWidget, SIGNAL(currentChanged(QWidget*)), SLOT(currentChanged(QWidget*)));
0036     connect(mWidget, SIGNAL(contextMenu(QWidget*,QPoint)), SLOT(contextMenu(QWidget*,QPoint)));
0037     connect(mWidget, SIGNAL(contextMenu(QPoint)), SLOT(tabbarContextMenu(QPoint)));
0038     connect(mWidget, SIGNAL(mouseDoubleClick(QWidget*)), SLOT(mouseDoubleClick(QWidget*)));
0039     connect(mWidget, SIGNAL(mouseMiddleClick()), SLOT(addTab()));
0040     connect(mWidget, SIGNAL(mouseMiddleClick(QWidget*)), SLOT(mouseMiddleClick(QWidget*)));
0041     connect(mWidget, SIGNAL(closeRequest(QWidget*)), SLOT(mouseMiddleClick(QWidget*)));
0042     connect(mWidget, SIGNAL(testCanDecode(const QDragMoveEvent*,bool&)), SLOT(testCanDecode(const QDragMoveEvent*,bool&)));
0043     connect(mWidget, SIGNAL(receivedDropEvent(QDropEvent*)), SLOT(receivedDropEvent(QDropEvent*)));
0044     connect(mWidget, SIGNAL(receivedDropEvent(QWidget*,QDropEvent*)), SLOT(receivedDropEvent(QWidget*,QDropEvent*)));
0045     connect(mWidget, SIGNAL(initiateDrag(QWidget*)), SLOT(initiateDrag(QWidget*)));
0046     connect(mWidget, SIGNAL(movedTab(int,int)), SLOT(movedTab(int,int)));
0047     mWidget->setMovable(true);
0048 
0049     topLayout->addWidget(mWidget);
0050 
0051     QWidget *grid = new QWidget(this);
0052     topLayout->addWidget(grid);
0053     QGridLayout *gridlayout = new QGridLayout(grid);
0054 
0055     QPushButton *addTab = new QPushButton("Add Tab", grid);
0056     gridlayout->addWidget(addTab, 0, 0);
0057     connect(addTab, SIGNAL(clicked()), SLOT(addTab()));
0058 
0059     QPushButton *removeTab = new QPushButton("Remove Current Tab", grid);
0060     gridlayout->addWidget(removeTab, 0, 1);
0061     connect(removeTab, SIGNAL(clicked()), SLOT(removeCurrentTab()));
0062 
0063     mLeftButton = new QCheckBox("Show left button", grid);
0064     gridlayout->addWidget(mLeftButton, 1, 0);
0065     connect(mLeftButton, SIGNAL(toggled(bool)), SLOT(toggleLeftButton(bool)));
0066     mLeftButton->setChecked(true);
0067 
0068     QCheckBox *leftPopup = new QCheckBox("Enable left popup", grid);
0069     gridlayout->addWidget(leftPopup, 2, 0);
0070     connect(leftPopup, SIGNAL(toggled(bool)), SLOT(toggleLeftPopup(bool)));
0071     leftPopup->setChecked(true);
0072 
0073     mRightButton = new QCheckBox("Show right button", grid);
0074     gridlayout->addWidget(mRightButton, 1, 1);
0075     connect(mRightButton, SIGNAL(toggled(bool)), SLOT(toggleRightButton(bool)));
0076     mRightButton->setChecked(true);
0077 
0078     QCheckBox *rightPopup = new QCheckBox("Enable right popup", grid);
0079     gridlayout->addWidget(rightPopup, 2, 1);
0080     connect(rightPopup, SIGNAL(toggled(bool)), SLOT(toggleRightPopup(bool)));
0081     rightPopup->setChecked(true);
0082 
0083     mTabsBottom = new QCheckBox("Show tabs at bottom", grid);
0084     gridlayout->addWidget(mTabsBottom, 3, 0);
0085     connect(mTabsBottom, SIGNAL(toggled(bool)), SLOT(toggleTabPosition(bool)));
0086 
0087     QCheckBox *tabshape = new QCheckBox("Triangular tab shape", grid);
0088     gridlayout->addWidget(tabshape, 3, 1);
0089     connect(tabshape, SIGNAL(toggled(bool)), SLOT(toggleTabShape(bool)));
0090 
0091     QCheckBox *tabClose = new QCheckBox("Close button on icon hover", grid);
0092     gridlayout->addWidget(tabClose, 4, 0);
0093     connect(tabClose, SIGNAL(toggled(bool)), SLOT(toggleCloseButtons(bool)));
0094     tabClose->setChecked(true);
0095 
0096     QCheckBox *showlabels = new QCheckBox("Show labels", grid);
0097     gridlayout->addWidget(showlabels, 4, 1);
0098     connect(showlabels, SIGNAL(toggled(bool)), this, SLOT(toggleLabels(bool)));
0099 
0100     QCheckBox *elideText = new QCheckBox("Elide text", grid);
0101     gridlayout->addWidget(elideText, 5, 0);
0102     connect(elideText, SIGNAL(toggled(bool)), this, SLOT(toggleEliding(bool)));
0103 
0104     QCheckBox *scrollButtons = new QCheckBox("Enable scroll buttons", grid);
0105     gridlayout->addWidget(scrollButtons, 5, 1);
0106     connect(scrollButtons, SIGNAL(toggled(bool)), this, SLOT(toggleScrollButtons(bool)));
0107 }
0108 
0109 void Test::currentChanged(QWidget *w)
0110 {
0111     mWidget->setTabTextColor(mWidget->indexOf(w), Qt::black);
0112 }
0113 
0114 void Test::addTab()
0115 {
0116     mWidget->addTab(new QWidget(), SmallIcon("konsole"), QString("This is tab %1").arg(mWidget->count() + 1));
0117 }
0118 
0119 void Test::testCanDecode(const QDragMoveEvent *e, bool &accept /* result */)
0120 {
0121     if (e->mimeData()->hasText()) {    // don't accept=false if it cannot be decoded!
0122         accept = true;
0123     }
0124 }
0125 
0126 void Test::receivedDropEvent(QDropEvent *e)
0127 {
0128     if (e->mimeData()->hasText()) {
0129         mWidget->addTab(new QWidget(), e->mimeData()->text());
0130     }
0131 }
0132 
0133 void Test::receivedDropEvent(QWidget *w, QDropEvent *e)
0134 {
0135     if (e->mimeData()->hasText()) {
0136         mWidget->setTabText(mWidget->indexOf(w), e->mimeData()->text());
0137     }
0138 }
0139 
0140 void Test::initiateDrag(QWidget *w)
0141 {
0142     QDrag *drag = new QDrag(this);
0143     QMimeData *mimeData = new QMimeData;
0144     mimeData->setText(mWidget->tabText(mWidget->indexOf(w)));
0145     drag->setMimeData(mimeData);
0146     drag->start(); // do NOT delete d.
0147 }
0148 
0149 void Test::removeCurrentTab()
0150 {
0151     if (mWidget->count() == 1) {
0152         return;
0153     }
0154 
0155     mWidget->removeTab(mWidget->currentIndex());
0156 }
0157 
0158 void Test::toggleLeftButton(bool state)
0159 {
0160     if (state) {
0161         if (!mLeftWidget) {
0162             mLeftWidget = new QToolButton(mWidget);
0163             connect(mLeftWidget, SIGNAL(clicked()), SLOT(addTab()));
0164             mLeftWidget->setIcon(SmallIcon("tab-new"));
0165             mLeftWidget->setText("New");
0166             mLeftWidget->setToolTip("New");
0167             mLeftWidget->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
0168             mLeftWidget->adjustSize();
0169             //mLeftWidget->setGeometry( 0, 0, h, h );
0170             mLeftWidget->setMenu(mLeftPopup);
0171             mWidget->setCornerWidget(mLeftWidget, Qt::TopLeftCorner);
0172         }
0173         mLeftWidget->show();
0174     } else {
0175         mLeftWidget->hide();
0176     }
0177 }
0178 
0179 void Test::toggleLeftPopup(bool state)
0180 {
0181     if (state) {
0182         if (!mLeftPopup) {
0183             mLeftPopup = new QMenu(this);
0184             mLeftPopup->addAction(SmallIcon("tab-new"), "Empty Tab");
0185             mLeftPopup->addAction(SmallIcon("tab-new"), "Empty Tab After First");
0186             mLeftPopup->addSeparator();
0187             mLeftPopup->addAction(SmallIcon("tab-new"), "Button Tab");
0188             mLeftPopup->addAction(SmallIcon("tab-new"), "Label Tab");
0189             connect(mLeftPopup, SIGNAL(triggered(QAction*)), SLOT(leftPopupActivated(QAction*)));
0190         }
0191         mLeftWidget->setMenu(mLeftPopup);
0192     } else {
0193         mLeftWidget->setMenu(nullptr);
0194     }
0195 }
0196 
0197 void Test::leftPopupActivated(QAction *action)
0198 {
0199     switch (mLeftPopup->actions().indexOf(action)) {
0200     case 0: mWidget->addTab(new QWidget(), QString("Tab %1").arg(mWidget->count() + 1));
0201         break;
0202     case 1: mWidget->insertTab(1, new QWidget(), QString("Tab %1").arg(mWidget->count() + 1));
0203         break;
0204     case 3: mWidget->addTab(new QPushButton("Testbutton"), QString("Tab %1").arg(mWidget->count() + 1));
0205         break;
0206     case 4: mWidget->addTab(new QLabel("Testlabel"), QString("Tab %1").arg(mWidget->count() + 1));
0207         break;
0208     }
0209 }
0210 
0211 void Test::toggleRightButton(bool state)
0212 {
0213     if (state) {
0214         if (!mRightWidget) {
0215             mRightWidget = new QToolButton(mWidget);
0216             QObject::connect(mRightWidget, SIGNAL(clicked()), SLOT(removeCurrentTab()));
0217             mRightWidget->setIcon(SmallIcon("tab-close"));
0218             mRightWidget->setText("Close");
0219             mRightWidget->setToolTip("Close");
0220             mRightWidget->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
0221             mRightWidget->adjustSize();
0222             //mRightButton->setGeometry( 0, 0, h, h );
0223             mRightWidget->setMenu(mRightPopup);
0224             mWidget->setCornerWidget(mRightWidget, Qt::TopRightCorner);
0225         }
0226         mRightWidget->show();
0227     } else {
0228         mRightWidget->hide();
0229     }
0230 }
0231 
0232 void Test::toggleRightPopup(bool state)
0233 {
0234     if (state) {
0235         if (!mRightPopup) {
0236             mRightPopup = new QMenu(this);
0237             mRightPopup->addAction(SmallIcon("tab-close"), "Current Tab");
0238             mRightPopup->addSeparator();
0239             mRightPopup->addAction(SmallIcon("tab-close"), "Most Left Tab");
0240             mRightPopup->addAction(SmallIcon("tab-close"), "Most Right Tab");
0241             connect(mRightPopup, SIGNAL(triggered(QAction*)), SLOT(rightPopupActivated(QAction*)));
0242         }
0243         mRightWidget->setMenu(mRightPopup);
0244     } else {
0245         mRightWidget->setMenu(nullptr);
0246     }
0247 }
0248 
0249 void Test::rightPopupActivated(QAction *action)
0250 {
0251     switch (mRightPopup->actions().indexOf(action)) {
0252     case 0: removeCurrentTab();
0253         break;
0254     case 2: if (mWidget->count() > 1) {
0255             mWidget->removeTab(0);
0256         }
0257         break;
0258     case 3: int count = mWidget->count();
0259         if (count > 1) {
0260             mWidget->removeTab(count - 1);
0261         }
0262         break;
0263     }
0264 }
0265 
0266 void Test::toggleTabPosition(bool state)
0267 {
0268     mWidget->setTabPosition(state ? QTabWidget::South : QTabWidget::North);
0269 }
0270 
0271 void Test::toggleTabShape(bool state)
0272 {
0273     mWidget->setTabShape(state ? QTabWidget::Triangular : QTabWidget::Rounded);
0274 }
0275 
0276 void Test::toggleCloseButtons(bool state)
0277 {
0278     mWidget->setTabsClosable(state);
0279 }
0280 
0281 void Test::contextMenu(QWidget *w, const QPoint &p)
0282 {
0283     delete mContextPopup;
0284 
0285     int idx = mWidget->indexOf(w);
0286     mContextPopup = new QMenu(this);
0287     mContextPopup->addAction("Activate Tab");
0288     mContextPopup->addSeparator();
0289     mContextPopup->addAction(SmallIcon("konsole"), "Set This Icon");
0290     mContextPopup->addAction(SmallIcon("konqueror"), "Set This Icon");
0291     mContextPopup->addSeparator();
0292     mContextPopup->addAction(mWidget->isTabEnabled(idx) ? "Disable Tab" : "Enable Tab");
0293     mContextPopup->addAction(mWidget->tabToolTip(idx).isEmpty() ? "Set Tooltip" : "Remove Tooltip");
0294     connect(mContextPopup, SIGNAL(triggered(QAction*)), SLOT(contextMenuActivated(QAction*)));
0295 
0296     mContextWidgetIndex = mWidget->indexOf(w);
0297     mContextPopup->popup(p);
0298 }
0299 
0300 void Test::contextMenuActivated(QAction *action)
0301 {
0302     switch (mContextPopup->actions().indexOf(action)) {
0303     case 0:
0304         mWidget->setCurrentIndex(mContextWidgetIndex);
0305         break;
0306     case 2:
0307         mWidget->setTabIcon(mContextWidgetIndex, SmallIcon("konsole"));
0308         break;
0309     case 3:
0310         mWidget->setTabIcon(mContextWidgetIndex, SmallIcon("konqueror"));
0311         break;
0312     case 4:
0313         mWidget->setTabEnabled(mContextWidgetIndex, !(mWidget->isTabEnabled(mContextWidgetIndex)));
0314         break;
0315     case 5:
0316         if (mWidget->tabToolTip(mContextWidgetIndex).isEmpty()) {
0317             mWidget->setTabToolTip(mContextWidgetIndex, "This is a tool tip.");
0318         } else {
0319             mWidget->setTabToolTip(mContextWidgetIndex, QString());
0320         }
0321         break;
0322     }
0323 }
0324 
0325 void Test::tabbarContextMenu(const QPoint &p)
0326 {
0327     delete mTabbarContextPopup;
0328 
0329     mTabbarContextPopup = new QMenu(this);
0330     mTabbarContextPopup->addAction(SmallIcon("tab-new"), mLeftWidget->isVisible() ? "Hide \"Add\" Button" : "Show \"Add\" Button");
0331     mTabbarContextPopup->addAction(SmallIcon("tab-close"), mRightWidget->isVisible() ? "Hide \"Remove\" Button" : "Show \"Remove\" Button");
0332     mTabbarContextPopup->addSeparator();
0333     mTabbarContextPopup->addAction(mWidget->tabPosition() == QTabWidget::North ? "Put Tabbar to Bottom" : "Put Tabbar to Top");
0334     connect(mTabbarContextPopup, SIGNAL(triggered(QAction*)), SLOT(tabbarContextMenuActivated(QAction*)));
0335 
0336     mTabbarContextPopup->popup(p);
0337 }
0338 
0339 void Test::tabbarContextMenuActivated(QAction *action)
0340 {
0341     switch (mTabbarContextPopup->actions().indexOf(action)) {
0342     case 0: mLeftButton->toggle();
0343         break;
0344     case 1: mRightButton->toggle();
0345         break;
0346     case 3: mTabsBottom->toggle();
0347         break;
0348     }
0349 }
0350 
0351 void Test::mouseDoubleClick(QWidget *w)
0352 {
0353     int index = mWidget->indexOf(w);
0354     bool ok;
0355     QString text = QInputDialog::getText(this, "Rename Tab", "Enter new name:",
0356                                          QLineEdit::Normal, mWidget->tabText(index), &ok);
0357     if (ok && !text.isEmpty()) {
0358         mWidget->setTabText(index, text);
0359         mWidget->setTabTextColor(index, Qt::green);
0360     }
0361 }
0362 
0363 void Test::mouseMiddleClick(QWidget *w)
0364 {
0365     if (mWidget->count() == 1) {
0366         return;
0367     }
0368 
0369     mWidget->removeTab(mWidget->indexOf(w));
0370 }
0371 
0372 void Test::movedTab(int from, int to)
0373 {
0374     kDebug() << "Moved tab from index " << from << " to " << to;
0375 }
0376 
0377 void Test::toggleLabels(bool state)
0378 {
0379     mLeftWidget->setToolButtonStyle(state ? Qt::ToolButtonTextUnderIcon : Qt::ToolButtonIconOnly);
0380     mLeftWidget->adjustSize();
0381     mRightWidget->setToolButtonStyle(state ? Qt::ToolButtonTextUnderIcon : Qt::ToolButtonIconOnly);
0382     mRightWidget->adjustSize();
0383     mWidget->hide();   // trigger update
0384     mWidget->show();
0385 }
0386 
0387 void Test::toggleScrollButtons(bool state)
0388 {
0389     mWidget->setUsesScrollButtons(state);
0390 }
0391 
0392 void Test::toggleEliding(bool state)
0393 {
0394     mWidget->setAutomaticResizeTabs(state);
0395     //mWidget->setElideMode(state ? Qt::ElideRight : Qt::ElideNone);
0396 }
0397 
0398 int main(int argc, char **argv)
0399 {
0400     QApplication::setApplicationName("ktabwidgettest");
0401     QApplication app(argc, argv);
0402     Test *t = new Test();
0403     t->show();
0404     app.exec();
0405 }
0406