diff --git a/CMakeLists.txt b/CMakeLists.txt index 09ef710b..1dbda78d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,50 +1,52 @@ project(systemsettings) set(PROJECT_VERSION "5.9.90") cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) set(QT_MIN_VERSION "5.4.0") +set(KF5_MIN_VERSION "5.30") remove_definitions(-DQT_NO_CAST_FROM_ASCII -DQT_STRICT_ITERATORS -DQT_NO_CAST_FROM_BYTEARRAY -DQT_NO_KEYWORDS) find_package(ECM 1.2.0 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) include(GenerateExportHeader) find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Widgets ) -find_package(KF5 REQUIRED COMPONENTS +find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS ItemViews KCMUtils I18n KIO Service IconThemes + WidgetsAddons WindowSystem XmlGui DBusAddons Config DocTools OPTIONAL_COMPONENTS KHtml QUIET ) add_subdirectory(core) add_subdirectory(app) add_subdirectory(categories) add_subdirectory(icons) add_subdirectory(doc) if(KF5KHtml_FOUND) add_subdirectory(classic) endif() feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 3fa8dbb5..51f87e0f 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -1,37 +1,35 @@ include_directories( ToolTips ) set( systemsettings_SRCS SystemSettingsApp.cpp SettingsBase.cpp - ToolTips/ktooltip.cpp - ToolTips/ktooltipwindow.cpp ToolTips/tooltipmanager.cpp main.cpp ) # port it it's in kdelibs4support # kde4_add_app_icon( systemsettings_SRCS "${KDE4_ICON_INSTALL_DIR}/oxygen/*/categories/preferences-system.png" ) ki18n_wrap_ui( systemsettings_SRCS configDialog.ui ) kconfig_add_kcfg_files( systemsettings_SRCS BaseConfig.kcfgc ) qt5_add_dbus_adaptor( systemsettings_SRCS org.kde.systemsettings.xml SystemSettingsApp.h SystemSettingsApp ) add_executable( systemsettings5 ${systemsettings_SRCS}) target_compile_definitions(systemsettings5 PRIVATE -DPROJECT_VERSION="${PROJECT_VERSION}") target_link_libraries( systemsettings5 systemsettingsview KF5::ItemViews KF5::KCMUtils KF5::I18n KF5::IconThemes KF5::KIOWidgets KF5::Service KF5::WindowSystem KF5::XmlGui KF5::DBusAddons KF5::ConfigGui ) install( TARGETS systemsettings5 ${INSTALL_TARGETS_DEFAULT_ARGS} ) install( FILES systemsettings.kcfg DESTINATION ${DATA_INSTALL_DIR}/systemsettings ) install( FILES systemsettingsui.rc DESTINATION ${KXMLGUI_INSTALL_DIR}/systemsettings ) install( PROGRAMS kdesystemsettings.desktop systemsettings.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} ) diff --git a/app/ToolTips/ktooltip.cpp b/app/ToolTips/ktooltip.cpp deleted file mode 100644 index 34561f1c..00000000 --- a/app/ToolTips/ktooltip.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Fredrik Höglund * - * * - * This program 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 2 of the License, or * - * (at your option) any later version. * - * * - * This program 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 this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - -#include "ktooltip.h" -#include "ktooltipwindow_p.h" -#include -#include -#include -#include - -class KToolTipManager -{ -public: - ~KToolTipManager(); - - static KToolTipManager* instance(); - - void showTip(const QPoint& pos, QWidget* content, QWindow *transientParent); - void hideTip(); - -private: - KToolTipManager(); - - KToolTipWindow* m_window; - static KToolTipManager *s_instance; -}; - -KToolTipManager *KToolTipManager::s_instance = 0; - -KToolTipManager::KToolTipManager() : - m_window(0) -{ -} - -KToolTipManager::~KToolTipManager() -{ - delete m_window; - m_window = 0; -} - -KToolTipManager* KToolTipManager::instance() -{ - if (s_instance == 0) { - s_instance = new KToolTipManager(); - } - - return s_instance; -} - -void KToolTipManager::showTip(const QPoint& pos, QWidget* content, QWindow *transientParent) -{ - hideTip(); - Q_ASSERT(m_window == 0); - m_window = new KToolTipWindow(content); - m_window->move(pos); - m_window->createWinId(); - m_window->windowHandle()->setTransientParent(transientParent); - m_window->show(); -} - -void KToolTipManager::hideTip() -{ - if (m_window != 0) { - m_window->hide(); - m_window->deleteLater(); - m_window = 0; - } -} - -namespace KToolTip -{ - void showText(const QPoint& pos, const QString& text, QWindow *transientParent) - { - QLabel* label = new QLabel(text); - label->setForegroundRole(QPalette::ToolTipText); - showTip(pos, label, transientParent); - } - - void showTip(const QPoint& pos, QWidget* content, QWindow *transientParent) - { - KToolTipManager::instance()->showTip(pos, content, transientParent); - } - - void hideTip() - { - KToolTipManager::instance()->hideTip(); - } -} - diff --git a/app/ToolTips/ktooltip.h b/app/ToolTips/ktooltip.h deleted file mode 100644 index 82ed45e7..00000000 --- a/app/ToolTips/ktooltip.h +++ /dev/null @@ -1,47 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Fredrik Höglund * - * * - * This program 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 2 of the License, or * - * (at your option) any later version. * - * * - * This program 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 this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef KTOOLTIP_H -#define KTOOLTIP_H - -class QPoint; -class QString; -class QWidget; -class QWindow; - -/** - * Allows to show tooltips having a widget as content. - */ -namespace KToolTip -{ - void showText(const QPoint& pos, const QString& text, QWindow *transientParent); - - /** - * Shows the tip @p content at the global position indicated by @p pos. - * - * Ownership of the content widget is transferred to KToolTip. The widget will be deleted - * automatically when it is hidden. - * - * The tip is shown immediately when this function is called. - */ - void showTip(const QPoint& pos, QWidget* content, QWindow *transientParent); - void hideTip(); -} - -#endif diff --git a/app/ToolTips/ktooltipwindow.cpp b/app/ToolTips/ktooltipwindow.cpp deleted file mode 100644 index 5c972d16..00000000 --- a/app/ToolTips/ktooltipwindow.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2008 by Fredrik Höglund * - * Copyright (C) 2008 by Konstantin Heil * - * Copyright (C) 2009 by Peter Penz * - * Copyright (C) 2012 by Mark Gaiser * - * * - * This program 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 2 of the License, or * - * (at your option) any later version. * - * * - * This program 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 this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - *******************************************************************************/ - -#include "ktooltipwindow_p.h" - -#include -#include -#include - -// For the blurred tooltip background -#include - -KToolTipWindow::KToolTipWindow(QWidget* content) : - QWidget(0) -{ - setAttribute(Qt::WA_TranslucentBackground); - setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint); - - QVBoxLayout* layout = new QVBoxLayout(this); - layout->addWidget(content); -} - -KToolTipWindow::~KToolTipWindow() -{ -} - -void KToolTipWindow::paintEvent(QPaintEvent* event) -{ - QStylePainter painter(this); - QStyleOptionFrame option; - option.init(this); - painter.drawPrimitive(QStyle::PE_PanelTipLabel, option); - painter.end(); - - QWidget::paintEvent(event); -} - -void KToolTipWindow::showEvent(QShowEvent *) -{ - KWindowEffects::enableBlurBehind(winId(), true, mask()); -} - -#include "moc_ktooltipwindow_p.cpp" diff --git a/app/ToolTips/ktooltipwindow_p.h b/app/ToolTips/ktooltipwindow_p.h deleted file mode 100644 index 4ffe22ba..00000000 --- a/app/ToolTips/ktooltipwindow_p.h +++ /dev/null @@ -1,40 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2009 by Peter Penz * - * Copyright (C) 2012 by Mark Gaiser * - * * - * This program 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 2 of the License, or * - * (at your option) any later version. * - * * - * This program 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 this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef KTOOLTIPWINDOW_H -#define KTOOLTIPWINDOW_H - -#include -class QPaintEvent; - -class KToolTipWindow : public QWidget -{ - Q_OBJECT - -public: - explicit KToolTipWindow(QWidget* content); - virtual ~KToolTipWindow(); - -protected: - virtual void paintEvent(QPaintEvent* event); - virtual void showEvent(QShowEvent *); -}; - -#endif diff --git a/app/ToolTips/tooltipmanager.cpp b/app/ToolTips/tooltipmanager.cpp index f2f9943c..31039af7 100644 --- a/app/ToolTips/tooltipmanager.cpp +++ b/app/ToolTips/tooltipmanager.cpp @@ -1,247 +1,195 @@ /******************************************************************************* * Copyright (C) 2008 by Konstantin Heil * * * * This program 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 2 of the License, or * * (at your option) any later version. * * * * This program 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 this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * *******************************************************************************/ #include "tooltipmanager.h" #include "MenuItem.h" -#include "ktooltip.h" - #include #include #include #include #include #include -#include #include #include #include #include +#include class ToolTipManager::Private { public: Private() : + tooltip(0), view(0), - timer(0) + timer(0), + delay(300) { } + KToolTipWidget *tooltip; QAbstractItemView* view; QTimer* timer; QModelIndex item; QRect itemRect; + int delay; }; ToolTipManager::ToolTipManager(QAbstractItemView* parent) : QObject(parent) , d(new ToolTipManager::Private) { d->view = parent; + d->tooltip = new KToolTipWidget(d->view); + d->tooltip->setHideDelay(0); connect(parent, &QAbstractItemView::viewportEntered, this, &ToolTipManager::hideToolTip); connect(parent, &QAbstractItemView::entered, this, &ToolTipManager::requestToolTip); d->timer = new QTimer(this); d->timer->setSingleShot(true); connect(d->timer, &QTimer::timeout, this, &ToolTipManager::prepareToolTip); // When the mousewheel is used, the items don't get a hovered indication // (Qt-issue #200665). To assure that the tooltip still gets hidden, // the scrollbars are observed. connect(parent->horizontalScrollBar(), &QAbstractSlider::valueChanged, this, &ToolTipManager::hideToolTip); connect(parent->verticalScrollBar(), &QAbstractSlider::valueChanged, this, &ToolTipManager::hideToolTip); - - d->view->viewport()->installEventFilter(this); } ToolTipManager::~ToolTipManager() { delete d; } -bool ToolTipManager::eventFilter(QObject* watched, QEvent* event) -{ - if ( watched == d->view->viewport() ) { - switch ( event->type() ) { - case QEvent::Leave: - case QEvent::MouseButtonPress: - hideToolTip(); - break; - case QEvent::ToolTip: - return true; - default: - break; - } - } - - return QObject::eventFilter(watched, event); -} - void ToolTipManager::requestToolTip(const QModelIndex& index) { // only request a tooltip for the name column and when no selection or // drag & drop operation is done (indicated by the left mouse button) if ( !(QApplication::mouseButtons() & Qt::LeftButton) ) { - KToolTip::hideTip(); + d->tooltip->hide(); d->itemRect = d->view->visualRect(index); const QPoint pos = d->view->viewport()->mapToGlobal(d->itemRect.topLeft()); d->itemRect.moveTo(pos); d->item = index; - d->timer->start(300); + d->timer->start(d->delay); } else { hideToolTip(); } } void ToolTipManager::hideToolTip() { d->timer->stop(); - KToolTip::hideTip(); + d->tooltip->hideLater(); } void ToolTipManager::prepareToolTip() { showToolTip( d->item ); } void ToolTipManager::showToolTip( QModelIndex menuItem ) { if (QApplication::mouseButtons() & Qt::LeftButton) { return; } QWidget * tip = createTipContent( menuItem ); - // calculate the x- and y-position of the tooltip - const QSize size = tip->sizeHint(); - const QRect desktop = QApplication::desktop()->screenGeometry( d->itemRect.bottomRight() ); - - // d->itemRect defines the area of the item, where the tooltip should be - // shown. Per default the tooltip is shown in the bottom right corner. - // If the tooltip content exceeds the desktop borders, it must be assured that: - // - the content is fully visible - // - the content is not drawn inside d->itemRect - const int margin = 3; - const bool hasRoomToLeft = (d->itemRect.left() - size.width() - margin >= desktop.left()); - const bool hasRoomToRight = (d->itemRect.right() + size.width() + margin <= desktop.right()); - const bool hasRoomAbove = (d->itemRect.top() - size.height() - margin >= desktop.top()); - const bool hasRoomBelow = (d->itemRect.bottom() + size.height() + margin <= desktop.bottom()); - if (!hasRoomAbove && !hasRoomBelow && !hasRoomToLeft && !hasRoomToRight) { - delete tip; - tip = 0; - return; - } - - int x = 0; - int y = 0; - if (hasRoomBelow || hasRoomAbove) { - x = qMax(desktop.left(), d->itemRect.center().x() - size.width() / 2); - if (x + size.width() / 2 >= desktop.right()) { - x = desktop.right() - size.width(); - } + d->tooltip->showBelow(d->itemRect, tip, d->view->nativeParentWidget()->windowHandle()); - y = hasRoomBelow ? d->itemRect.bottom() + margin : d->itemRect.top() - size.height() - margin; - } else { - Q_ASSERT(hasRoomToLeft || hasRoomToRight); - x = hasRoomToRight ? d->itemRect.right() + margin : d->itemRect.left() - size.width() - margin; - - // Put the tooltip at the bottom of the screen. The x-coordinate has already - // been adjusted, so that no overlapping with d->itemRect occurs. - y = desktop.bottom() - size.height(); - } + connect(d->tooltip, &KToolTipWidget::hidden, tip, &QObject::deleteLater); - // the ownership of tip is transferred to KToolTip - KToolTip::showTip(QPoint(x, y), tip, d->view->nativeParentWidget()->windowHandle()); } QWidget * ToolTipManager::createTipContent( QModelIndex item ) { const QSize dialogIconSize = QSize(IconSize(KIconLoader::Dialog), IconSize(KIconLoader::Dialog)); const QSize toolbarIconSize = QSize(IconSize(KIconLoader::MainToolbar), IconSize(KIconLoader::MainToolbar)); QWidget * tipContent = new QWidget(); QGridLayout* tipLayout = new QGridLayout(); tipLayout->setAlignment( Qt::AlignLeft ); QLayout * primaryLine = generateToolTipLine( &item, tipContent, dialogIconSize, true ); primaryLine->setAlignment( Qt::AlignLeft ); tipLayout->addLayout( primaryLine, 0, 0, Qt::AlignLeft ); for ( int done = 0; d->view->model()->rowCount( item ) > done; done = 1 + done ) { QModelIndex childItem = d->view->model()->index( done, 0, item ); QLayout * subLine = generateToolTipLine( &childItem, tipContent, toolbarIconSize, false ); subLine->setAlignment( Qt::AlignLeft ); tipLayout->addLayout( subLine, done + 2, 0, Qt::AlignLeft ); } tipLayout->setVerticalSpacing( tipContent->fontMetrics().height() / 3 ); tipContent->setLayout( tipLayout ); if( d->view->model()->rowCount( item ) > 0 ) { QFrame * separatorLine = new QFrame( tipContent ); separatorLine->setFrameStyle( QFrame::HLine ); tipLayout->addWidget( separatorLine, 1, 0 ); } return tipContent; } QLayout * ToolTipManager::generateToolTipLine( QModelIndex * item, QWidget * toolTip, QSize iconSize, bool comment ) { // Get MenuItem MenuItem * menuItem = d->view->model()->data( *item, Qt::UserRole ).value(); QString text = menuItem->name(); if ( comment ) { text = QString( "%1" ).arg( menuItem->name() ); } // Generate text if ( comment ) { text += "
"; if ( !menuItem->service()->comment().isEmpty() ) { text += menuItem->service()->comment(); } else { int childCount = d->view->model()->rowCount( *item ); text += i18np( "Contains 1 item", "Contains %1 items", childCount ); } } QLabel * textLabel = new QLabel( toolTip ); textLabel->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); textLabel->setForegroundRole(QPalette::ToolTipText); textLabel->setText( text ); // Get icon QLabel * iconLabel = new QLabel( toolTip ); iconLabel->setPixmap( QIcon::fromTheme(menuItem->service()->icon()).pixmap(iconSize) ); iconLabel->setMaximumSize( iconSize ); // Generate layout QHBoxLayout * layout = new QHBoxLayout(); layout->setSpacing( textLabel->fontMetrics().height() / 3 ); layout->setAlignment( Qt::AlignLeft ); layout->addWidget( iconLabel, Qt::AlignLeft ); layout->addWidget( textLabel, Qt::AlignLeft ); return layout; } diff --git a/app/ToolTips/tooltipmanager.h b/app/ToolTips/tooltipmanager.h index c2b547fe..0e4d032d 100644 --- a/app/ToolTips/tooltipmanager.h +++ b/app/ToolTips/tooltipmanager.h @@ -1,82 +1,72 @@ /******************************************************************************* * Copyright (C) 2008 by Konstantin Heil * * * * This program 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 2 of the License, or * * (at your option) any later version. * * * * This program 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 this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * *******************************************************************************/ #ifndef TOOLTIPMANAGER_H #define TOOLTIPMANAGER_H #include #include class QLayout; class QAbstractItemView; /** * @brief Manages the tooltips for an item view. * * When hovering an item, a tooltip is shown after * a short timeout. The tooltip is hidden again when the * viewport is hovered or the item view has been left. */ class ToolTipManager : public QObject { Q_OBJECT public: /** * Standard constructor. The ToolTipManager will start handling ToolTip events on the provided * view immediately. * * @param parent The view which will have the tooltips displayed for. */ explicit ToolTipManager(QAbstractItemView* parent); virtual ~ToolTipManager(); public Q_SLOTS: /** * Hides the currently shown tooltip. Invoking this method is * only needed when the tooltip should be hidden although * an item is hovered. */ void hideToolTip(); -protected: - /** - * Please see the Qt documentation for more details. - * - * @param watched The object that was being watched. - * @param event The event object. - * @returns true if the event was handled in this filter, or false if it was not. - */ - virtual bool eventFilter( QObject* watched, QEvent* event ); - private Q_SLOTS: void prepareToolTip(); void requestToolTip(const QModelIndex& index); private: void showToolTip( QModelIndex menuItem ); QWidget * createTipContent( QModelIndex item ); QLayout * generateToolTipLine( QModelIndex * item, QWidget * toolTip, QSize iconSize, bool comment ); class Private; ToolTipManager::Private* d; }; #endif