/* * Copyright (C) 2014, 2015 Nicolas Bonnefon and other contributors * * This file is part of glogg. * * glogg is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * glogg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glogg. If not, see . */ #include "tabbedcrawlerwidget.h" #include #include #include "crawlerwidget.h" #include "log.h" TabbedCrawlerWidget::TabbedCrawlerWidget() : QTabWidget(), olddata_icon_( ":/images/olddata_icon.png" ), newdata_icon_( ":/images/newdata_icon.png" ), newfiltered_icon_( ":/images/newfiltered_icon.png" ), myTabBar_() { #ifdef WIN32 myTabBar_.setStyleSheet( "QTabBar::tab {\ height: 20px; " "} " "QTabBar::close-button {\ height: 6px; width: 6px;\ subcontrol-origin: padding;\ subcontrol-position: left;\ }" ); #else // On GTK style, it looks better with a smaller font myTabBar_.setStyleSheet( "QTabBar::tab {" " height: 20px; " " font-size: 9pt; " "} " "QTabBar::close-button {\ height: 6px; width: 6px;\ subcontrol-origin: padding;\ subcontrol-position: left;\ }" ); #endif setTabBar( &myTabBar_ ); myTabBar_.hide(); } // I know hiding non-virtual functions from the base class is bad form // and I do it here out of pure laziness: I don't want to encapsulate // QTabBar with all signals and all just to implement this very simple logic. // Maybe one day that should be done better... int TabbedCrawlerWidget::addTab( QWidget* page, const QString& label ) { int index = QTabWidget::addTab( page, label ); if ( auto crawler = dynamic_cast( page ) ) { // Mmmmhhhh... new Qt5 signal syntax create tight coupling between // us and the sender, baaaaad.... // Listen for a changing data status: connect( crawler, &CrawlerWidget::dataStatusChanged, [ this, index ]( DataStatus status ) { setTabDataStatus( index, status ); } ); } // Display the icon QLabel* icon_label = new QLabel(); icon_label->setPixmap( olddata_icon_.pixmap( 11, 12 ) ); icon_label->setAlignment( Qt::AlignCenter ); myTabBar_.setTabButton( index, QTabBar::RightSide, icon_label ); LOG(logDEBUG) << "addTab, count = " << count(); LOG(logDEBUG) << "width = " << olddata_icon_.pixmap( 11, 12 ).devicePixelRatio(); if ( count() > 1 ) myTabBar_.show(); return index; } void TabbedCrawlerWidget::removeTab( int index ) { QTabWidget::removeTab( index ); if ( count() <= 1 ) myTabBar_.hide(); } void TabbedCrawlerWidget::mouseReleaseEvent( QMouseEvent *event) { LOG(logDEBUG) << "TabbedCrawlerWidget::mouseReleaseEvent"; if (event->button() == Qt::MidButton) { int tab = this->myTabBar_.tabAt( event->pos() ); if (-1 != tab) { emit tabCloseRequested( tab ); } } } void TabbedCrawlerWidget::keyPressEvent( QKeyEvent* event ) { const auto mod = event->modifiers(); const auto key = event->key(); LOG(logDEBUG) << "TabbedCrawlerWidget::keyPressEvent"; // Ctrl + tab if ( ( mod == Qt::ControlModifier && key == Qt::Key_Tab ) || ( mod == ( Qt::ControlModifier | Qt::AltModifier | Qt::KeypadModifier ) && key == Qt::Key_Right ) ) { setCurrentIndex( ( currentIndex() + 1 ) % count() ); } // Ctrl + shift + tab else if ( ( mod == ( Qt::ControlModifier | Qt::ShiftModifier ) && key == Qt::Key_Tab ) || ( mod == ( Qt::ControlModifier | Qt::AltModifier | Qt::KeypadModifier ) && key == Qt::Key_Left ) ) { setCurrentIndex( ( currentIndex() - 1 >= 0 ) ? currentIndex() - 1 : count() - 1 ); } // Ctrl + numbers else if ( mod == Qt::ControlModifier && ( key >= Qt::Key_1 && key <= Qt::Key_8 ) ) { int new_index = key - Qt::Key_0; if ( new_index <= count() ) setCurrentIndex( new_index - 1 ); } // Ctrl + 9 else if ( mod == Qt::ControlModifier && key == Qt::Key_9 ) { setCurrentIndex( count() - 1 ); } else if ( mod == Qt::ControlModifier && (key == Qt::Key_Q || key == Qt::Key_W) ) { emit tabCloseRequested( currentIndex() ); } else { QTabWidget::keyPressEvent( event ); } } void TabbedCrawlerWidget::setTabDataStatus( int index, DataStatus status ) { LOG(logDEBUG) << "TabbedCrawlerWidget::setTabDataStatus " << index; QLabel* icon_label = dynamic_cast( myTabBar_.tabButton( index, QTabBar::RightSide ) ); if ( icon_label ) { const QIcon* icon; switch ( status ) { case DataStatus::OLD_DATA: icon = &olddata_icon_; break; case DataStatus::NEW_DATA: icon = &newdata_icon_; break; case DataStatus::NEW_FILTERED_DATA: icon = &newfiltered_icon_; break; default: return; } icon_label->setPixmap ( icon->pixmap(12,12) ); } }