diff --git a/lib/images/closetab.xpm b/lib/images/closetab.xpm new file mode 100644 index 0000000000..94e1c915df --- /dev/null +++ b/lib/images/closetab.xpm @@ -0,0 +1,90 @@ +/* XPM */ +static char * closetab_xpm[] = { +"16 16 71 1", +" c None", +". c #272727", +"+ c #2C2C2C", +"@ c #393939", +"# c #3E3F3F", +"$ c #3F3F3F", +"% c #2C2C2C", +"& c #2D2D2D", +"* c #404040", +"= c #414141", +"- c #2B2B2B", +"; c #333333", +"> c #3E3E3E", +", c #444544", +"' c #454545", +") c #2D2D2D", +"! c #3A3A3A", +"~ c #414141", +"{ c #484748", +"] c #484848", +"^ c #323232", +"/ c #373737", +"( c #474747", +"_ c #484848", +": c #2F2F2F", +"< c #3F3F3F", +"[ c #424242", +"} c #484949", +"| c #494949", +"1 c #363636", +"2 c #494949", +"3 c #FFFFFF", +"4 c #4A4A4A", +"5 c #4F4F4F", +"6 c #505050", +"7 c #525252", +"8 c #3C3C3C", +"9 c #404040", +"0 c #4D4D4D", +"a c #4E4E4E", +"b c #414141", +"c c #424242", +"d c #5A5A5A", +"e c #5D5D5D", +"f c #E0E0E0", +"g c #E2E2E2", +"h c #E3E3E3", +"i c #E5E5E5", +"j c #E7E7E7", +"k c #3E3E3E", +"l c #5B5B5B", +"m c #4B4B4B", +"n c #373737", +"o c #434343", +"p c #5E5E5E", +"q c #626262", +"r c #444444", +"s c #6A6A6A", +"t c #6B6B6B", +"u c #737373", +"v c #878787", +"w c #999999", +"x c #9B9B9B", +"y c #9C9C9C", +"z c #DEDEDE", +"A c #454545", +"B c #474747", +"C c #494949", +"D c #545454", +"E c #555555", +"F c #414140", +" ", +" -)::)- ", +" ^n8kk8n^ ", +" 19Ca77aC91 ", +" /r5ytqqty5r/ ", +" ;b5x3iuui3x5b; ", +" !4Eef3jj3feE4! ", +" <5d7mg33gm7d5< ", +" [7eplg33glpe7[ ", +" ~6dsh3ff3hsd6~ ", +" >0Dw3z88z3wD0> ", +" (acvobFovca( ", +" 2B9A66A9B2 ", +" _406604_ ", +" ']}|{, ", +" "}; diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index a8fdc1435f..4125433958 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -53,6 +53,9 @@ #include #include #include +#include +#include + #include #include @@ -75,23 +78,55 @@ int const statusbar_timer_value = 3000; class TabWidget : public QWidget { + QHBoxLayout* hlayout; public: QTabBar* tabbar; + QToolButton* closeTabButton; + + void hideTabsIfNecessary() + { + if (tabbar->count() > 1) { + tabbar->show(); + closeTabButton->show(); + } else { + tabbar->hide(); + closeTabButton->hide(); + } + } TabWidget(QWidget* w, bool topTabBar) { + closeTabButton = new QToolButton(this); + FileName const file = support::libFileSearch("images", "closetab", "xpm"); + if (!file.empty()) { + QPixmap pm(toqstr(file.absFilename())); + closeTabButton->setIcon(QIcon(pm)); + } else { + closeTabButton->setText("Close"); + } + closeTabButton->setCursor(Qt::ArrowCursor); + closeTabButton->setAutoRaise(true); + closeTabButton->setToolTip(tr("Close tab")); + closeTabButton->setEnabled(true); + tabbar = new QTabBar; - QVBoxLayout* layout = new QVBoxLayout; + hlayout = new QHBoxLayout; + QVBoxLayout* vlayout = new QVBoxLayout; + hlayout->addWidget(tabbar); + hlayout->addStretch(1); + hlayout->addWidget(closeTabButton); if (topTabBar) { - layout->addWidget(tabbar); - layout->addWidget(w); + vlayout->addLayout(hlayout); + vlayout->addWidget(w); } else { tabbar->setShape(QTabBar::RoundedSouth); - layout->addWidget(w); - layout->addWidget(tabbar); + vlayout->addWidget(w); + vlayout->addLayout(hlayout); } - layout->setMargin(0); - setLayout(layout); + vlayout->setMargin(0); + hlayout->setMargin(0); + setLayout(vlayout); + hideTabsIfNecessary(); } void clearTabbar() @@ -141,7 +176,6 @@ struct GuiView::GuiViewPrivate QObject::connect(normalIcons, SIGNAL(triggered()), parent, SLOT(normalSizedIcons())); menu->addAction(normalIcons); - QAction *bigIcons = new QAction(iconSizeGroup); bigIcons->setText(qt_("Big-sized icons")); bigIcons->setCheckable(true); @@ -534,6 +568,8 @@ void GuiView::initTab(QWidget* workarea) setCentralWidget(d.tabWidget); QObject::connect(d.tabWidget->tabbar, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int))); + QObject::connect(d.tabWidget->closeTabButton, SIGNAL(clicked()), + this, SLOT(closeCurrentTab())); } @@ -571,6 +607,13 @@ void GuiView::updateTab() } } tabbar.blockSignals(false); + d.tabWidget->hideTabsIfNecessary(); +} + + +void GuiView::closeCurrentTab() +{ + dispatch(FuncRequest(LFUN_BUFFER_CLOSE)); } diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h index 5d10faeda2..2d8d172eee 100644 --- a/src/frontends/qt4/GuiView.h +++ b/src/frontends/qt4/GuiView.h @@ -98,7 +98,8 @@ public Q_SLOTS: /// populate a toplevel menu and all its children on demand void updateMenu(QAction *); - void currentTabChanged (int index); + void currentTabChanged(int index); + void closeCurrentTab(); /// slots to change the icon size void smallSizedIcons();