Changeset View
Changeset View
Standalone View
Standalone View
sidebar/SidebarMode.cpp
Show First 20 Lines • Show All 57 Lines • ▼ Show 20 Line(s) | |||||
58 | 58 | | |||
59 | namespace KAStats = KActivities::Stats; | 59 | namespace KAStats = KActivities::Stats; | ||
60 | 60 | | |||
61 | using namespace KAStats; | 61 | using namespace KAStats; | ||
62 | using namespace KAStats::Terms; | 62 | using namespace KAStats::Terms; | ||
63 | 63 | | |||
64 | K_PLUGIN_FACTORY( SidebarModeFactory, registerPlugin<SidebarMode>(); ) | 64 | K_PLUGIN_FACTORY( SidebarModeFactory, registerPlugin<SidebarMode>(); ) | ||
65 | 65 | | |||
66 | FocusHackWidget::FocusHackWidget(QWidget *parent) | ||||
67 | : QWidget(parent) | ||||
68 | {} | ||||
69 | FocusHackWidget::~FocusHackWidget() | ||||
70 | {} | ||||
71 | | ||||
72 | void FocusHackWidget::focusNext() | ||||
73 | { | ||||
74 | focusNextChild(); | ||||
75 | } | ||||
76 | | ||||
77 | void FocusHackWidget::focusPrevious() | ||||
78 | { | ||||
79 | focusNextPrevChild(false); | ||||
80 | } | ||||
81 | | ||||
66 | class SubcategoryModel : public QStandardItemModel | 82 | class SubcategoryModel : public QStandardItemModel | ||
67 | { | 83 | { | ||
68 | public: | 84 | public: | ||
69 | SubcategoryModel(QAbstractItemModel *parentModel, QObject *parent = 0) | 85 | SubcategoryModel(QAbstractItemModel *parentModel, QObject *parent = 0) | ||
70 | : QStandardItemModel(parent), | 86 | : QStandardItemModel(parent), | ||
71 | m_parentModel(parentModel) | 87 | m_parentModel(parentModel) | ||
72 | {} | 88 | {} | ||
73 | 89 | | |||
▲ Show 20 Lines • Show All 142 Lines • ▼ Show 20 Line(s) | 231 | virtual ~Private() { | |||
216 | delete aboutIcon; | 232 | delete aboutIcon; | ||
217 | } | 233 | } | ||
218 | 234 | | |||
219 | ToolTipManager *toolTipManager; | 235 | ToolTipManager *toolTipManager; | ||
220 | QQuickWidget * quickWidget; | 236 | QQuickWidget * quickWidget; | ||
221 | KPackage::Package package; | 237 | KPackage::Package package; | ||
222 | SubcategoryModel * subCategoryModel; | 238 | SubcategoryModel * subCategoryModel; | ||
223 | MostUsedModel * mostUsedModel; | 239 | MostUsedModel * mostUsedModel; | ||
224 | QWidget * mainWidget; | 240 | FocusHackWidget * mainWidget; | ||
225 | QQuickWidget * placeHolderWidget; | 241 | QQuickWidget * placeHolderWidget; | ||
226 | QHBoxLayout * mainLayout; | 242 | QHBoxLayout * mainLayout; | ||
227 | KDeclarative::KDeclarative kdeclarative; | 243 | KDeclarative::KDeclarative kdeclarative; | ||
228 | MenuProxyModel * categorizedModel; | 244 | MenuProxyModel * categorizedModel; | ||
229 | MenuProxyModel * searchModel; | 245 | MenuProxyModel * searchModel; | ||
230 | KAboutData * aboutIcon; | 246 | KAboutData * aboutIcon; | ||
231 | ModuleView * moduleView; | 247 | ModuleView * moduleView; | ||
232 | KActionCollection *collection; | 248 | KActionCollection *collection; | ||
▲ Show 20 Lines • Show All 82 Lines • ▼ Show 20 Line(s) | 330 | if (d->activeCategoryIndex.isValid() && d->activeCategoryIndex.row() >= 0) { | |||
315 | d->subCategoryModel->setParentIndex( d->activeCategoryIndex ); | 331 | d->subCategoryModel->setParentIndex( d->activeCategoryIndex ); | ||
316 | emit activeCategoryChanged(); | 332 | emit activeCategoryChanged(); | ||
317 | } | 333 | } | ||
318 | }); | 334 | }); | ||
319 | 335 | | |||
320 | d->mostUsedModel = new MostUsedModel( this ); | 336 | d->mostUsedModel = new MostUsedModel( this ); | ||
321 | 337 | | |||
322 | d->subCategoryModel = new SubcategoryModel( d->searchModel, this ); | 338 | d->subCategoryModel = new SubcategoryModel( d->searchModel, this ); | ||
323 | d->mainWidget = new QWidget(); | 339 | d->mainWidget = new FocusHackWidget(); | ||
324 | d->mainWidget->installEventFilter(this); | 340 | d->mainWidget->installEventFilter(this); | ||
325 | d->mainLayout = new QHBoxLayout(d->mainWidget); | 341 | d->mainLayout = new QHBoxLayout(d->mainWidget); | ||
326 | d->mainLayout->setContentsMargins(0, 0, 0, 0); | 342 | d->mainLayout->setContentsMargins(0, 0, 0, 0); | ||
327 | d->moduleView = new ModuleView( d->mainWidget ); | 343 | d->moduleView = new ModuleView( d->mainWidget ); | ||
328 | connect( d->moduleView, &ModuleView::moduleChanged, this, &SidebarMode::moduleLoaded ); | 344 | connect( d->moduleView, &ModuleView::moduleChanged, this, &SidebarMode::moduleLoaded ); | ||
329 | d->quickWidget = 0; | 345 | d->quickWidget = 0; | ||
330 | moduleView()->setFaceType(KPageView::Plain); | 346 | moduleView()->setFaceType(KPageView::Plain); | ||
331 | } | 347 | } | ||
▲ Show 20 Lines • Show All 98 Lines • ▼ Show 20 Line(s) | 443 | { | |||
430 | if (!KMainWindow::memberList().isEmpty()) { | 446 | if (!KMainWindow::memberList().isEmpty()) { | ||
431 | KXmlGuiWindow *mainWindow = qobject_cast<KXmlGuiWindow *>(KMainWindow::memberList().first()); | 447 | KXmlGuiWindow *mainWindow = qobject_cast<KXmlGuiWindow *>(KMainWindow::memberList().first()); | ||
432 | if (mainWindow) { | 448 | if (mainWindow) { | ||
433 | d->collection = mainWindow->actionCollection(); | 449 | d->collection = mainWindow->actionCollection(); | ||
434 | } | 450 | } | ||
435 | } | 451 | } | ||
436 | 452 | | |||
437 | d->quickWidget = new QQuickWidget(d->mainWidget); | 453 | d->quickWidget = new QQuickWidget(d->mainWidget); | ||
454 | d->quickWidget->quickWindow()->setTitle(i18n("Sidebar")); | ||||
438 | d->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); | 455 | d->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); | ||
456 | | ||||
439 | d->quickWidget->engine()->rootContext()->setContextProperty("systemsettings", this); | 457 | d->quickWidget->engine()->rootContext()->setContextProperty("systemsettings", this); | ||
440 | d->package = KPackage::PackageLoader::self()->loadPackage("KPackage/GenericQML"); | 458 | d->package = KPackage::PackageLoader::self()->loadPackage("KPackage/GenericQML"); | ||
441 | d->package.setPath(QStringLiteral("org.kde.systemsettings.sidebar")); | 459 | d->package.setPath(QStringLiteral("org.kde.systemsettings.sidebar")); | ||
442 | 460 | | |||
443 | d->kdeclarative.setDeclarativeEngine(d->quickWidget->engine()); | 461 | d->kdeclarative.setDeclarativeEngine(d->quickWidget->engine()); | ||
444 | d->kdeclarative.setupBindings(); | 462 | d->kdeclarative.setupBindings(); | ||
445 | 463 | | |||
446 | d->quickWidget->setSource(QUrl::fromLocalFile(d->package.filePath("mainscript"))); | 464 | d->quickWidget->setSource(QUrl::fromLocalFile(d->package.filePath("mainscript"))); | ||
447 | 465 | | |||
448 | const int rootImplicitWidth = d->quickWidget->rootObject()->property("implicitWidth").toInt(); | 466 | const int rootImplicitWidth = d->quickWidget->rootObject()->property("implicitWidth").toInt(); | ||
449 | if (rootImplicitWidth != 0) { | 467 | if (rootImplicitWidth != 0) { | ||
450 | d->quickWidget->setFixedWidth(rootImplicitWidth); | 468 | d->quickWidget->setFixedWidth(rootImplicitWidth); | ||
451 | } else { | 469 | } else { | ||
452 | d->quickWidget->setFixedWidth(240); | 470 | d->quickWidget->setFixedWidth(240); | ||
453 | } | 471 | } | ||
454 | connect(d->quickWidget->rootObject(), &QQuickItem::implicitWidthChanged, | 472 | connect(d->quickWidget->rootObject(), &QQuickItem::implicitWidthChanged, | ||
455 | this, [this]() { | 473 | this, [this]() { | ||
456 | const int rootImplicitWidth = d->quickWidget->rootObject()->property("implicitWidth").toInt(); | 474 | const int rootImplicitWidth = d->quickWidget->rootObject()->property("implicitWidth").toInt(); | ||
457 | if (rootImplicitWidth != 0) { | 475 | if (rootImplicitWidth != 0) { | ||
458 | d->quickWidget->setFixedWidth(rootImplicitWidth); | 476 | d->quickWidget->setFixedWidth(rootImplicitWidth); | ||
459 | } else { | 477 | } else { | ||
460 | d->quickWidget->setFixedWidth(240); | 478 | d->quickWidget->setFixedWidth(240); | ||
461 | } | 479 | } | ||
462 | }); | 480 | }); | ||
481 | connect(d->quickWidget->rootObject(), SIGNAL(focusNextRequest()), d->mainWidget, SLOT(focusNext())); | ||||
482 | connect(d->quickWidget->rootObject(), SIGNAL(focusPreviousRequest()), d->mainWidget, SLOT(focusPrevious())); | ||||
463 | 483 | | |||
464 | d->quickWidget->installEventFilter(this); | 484 | d->quickWidget->installEventFilter(this); | ||
465 | 485 | | |||
466 | d->toolTipManager = new ToolTipManager(d->searchModel, d->quickWidget); | 486 | d->toolTipManager = new ToolTipManager(d->searchModel, d->quickWidget); | ||
467 | 487 | | |||
468 | d->placeHolderWidget = new QQuickWidget(d->mainWidget); | 488 | d->placeHolderWidget = new QQuickWidget(d->mainWidget); | ||
489 | d->placeHolderWidget->quickWindow()->setTitle(i18n("Most Used")); | ||||
469 | d->placeHolderWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); | 490 | d->placeHolderWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); | ||
470 | d->placeHolderWidget->engine()->rootContext()->setContextObject(new KLocalizedContext(d->placeHolderWidget)); | 491 | d->placeHolderWidget->engine()->rootContext()->setContextObject(new KLocalizedContext(d->placeHolderWidget)); | ||
471 | d->placeHolderWidget->engine()->rootContext()->setContextProperty("systemsettings", this); | 492 | d->placeHolderWidget->engine()->rootContext()->setContextProperty("systemsettings", this); | ||
472 | d->placeHolderWidget->setSource(QUrl::fromLocalFile(d->package.filePath("ui", "introPage.qml"))); | 493 | d->placeHolderWidget->setSource(QUrl::fromLocalFile(d->package.filePath("ui", "introPage.qml"))); | ||
494 | connect(d->placeHolderWidget->rootObject(), SIGNAL(focusNextRequest()), d->mainWidget, SLOT(focusNext())); | ||||
495 | connect(d->placeHolderWidget->rootObject(), SIGNAL(focusPreviousRequest()), d->mainWidget, SLOT(focusPrevious())); | ||||
496 | d->placeHolderWidget->installEventFilter(this); | ||||
473 | 497 | | |||
474 | d->mainLayout->addWidget( d->quickWidget ); | 498 | d->mainLayout->addWidget( d->quickWidget ); | ||
475 | d->moduleView->hide(); | 499 | d->moduleView->hide(); | ||
476 | d->mainLayout->addWidget( d->moduleView ); | 500 | d->mainLayout->addWidget( d->moduleView ); | ||
477 | d->mainLayout->addWidget( d->placeHolderWidget ); | 501 | d->mainLayout->addWidget( d->placeHolderWidget ); | ||
478 | emit changeToolBarItems(BaseMode::NoItems); | 502 | emit changeToolBarItems(BaseMode::NoItems); | ||
479 | 503 | | |||
480 | d->mostUsedModel->setResultModel(new ResultModel( AllResources | Agent("org.kde.systemsettings") | HighScoredFirst | Limit(5), this)); | 504 | d->mostUsedModel->setResultModel(new ResultModel( AllResources | Agent("org.kde.systemsettings") | HighScoredFirst | Limit(5), this)); | ||
481 | } | 505 | } | ||
482 | 506 | | |||
483 | bool SidebarMode::eventFilter(QObject* watched, QEvent* event) | 507 | bool SidebarMode::eventFilter(QObject* watched, QEvent* event) | ||
484 | { | 508 | { | ||
485 | //TODO: patch Qt | 509 | //FIXME: those are all workarounds around the QQuickWidget brokeness | ||
486 | if (watched == d->quickWidget && event->type() == QEvent::Leave) { | 510 | if ((watched == d->quickWidget || watched == d->placeHolderWidget) | ||
511 | && event->type() == QEvent::KeyPress) { | ||||
512 | //allow tab navigation inside the qquickwidget | ||||
513 | QKeyEvent *ke = static_cast<QKeyEvent *>(event); | ||||
514 | QQuickWidget *qqw = static_cast<QQuickWidget *>(watched); | ||||
515 | if (ke->key() == Qt::Key_Tab || ke->key() == Qt::Key_Backtab) { | ||||
davidedmundson: either rootObject()->metaObject()->method("")->invoke();
or
QMetaObject::invoke()
getting… | |||||
516 | QCoreApplication::sendEvent(qqw->quickWindow(), event); | ||||
517 | return true; | ||||
518 | } | ||||
519 | } else if ((watched == d->quickWidget || watched == d->placeHolderWidget) | ||||
520 | && event->type() == QEvent::FocusIn) { | ||||
521 | QFocusEvent *fe = static_cast<QFocusEvent *>(event); | ||||
522 | QQuickWidget *qqw = static_cast<QQuickWidget *>(watched); | ||||
523 | if (qqw && qqw->rootObject()) { | ||||
524 | if (fe->reason() == Qt::TabFocusReason) { | ||||
525 | QMetaObject::invokeMethod(qqw->rootObject(), "focusFirstChild"); | ||||
526 | } else if (fe->reason() == Qt::BacktabFocusReason) { | ||||
527 | QMetaObject::invokeMethod(qqw->rootObject(), "focusLastChild"); | ||||
528 | } | ||||
529 | } | ||||
530 | } else if (watched == d->quickWidget && event->type() == QEvent::Leave) { | ||||
487 | QCoreApplication::sendEvent(d->quickWidget->quickWindow(), event); | 531 | QCoreApplication::sendEvent(d->quickWidget->quickWindow(), event); | ||
488 | } else if (watched == d->mainWidget && event->type() == QEvent::Resize) { | 532 | } else if (watched == d->mainWidget && event->type() == QEvent::Resize) { | ||
489 | emit widthChanged(); | 533 | emit widthChanged(); | ||
490 | } else if (watched == d->mainWidget && event->type() == QEvent::Show) { | 534 | } else if (watched == d->mainWidget && event->type() == QEvent::Show) { | ||
491 | emit changeToolBarItems(BaseMode::NoItems); | 535 | emit changeToolBarItems(BaseMode::NoItems); | ||
492 | } | 536 | } | ||
493 | return BaseMode::eventFilter(watched, event); | 537 | return BaseMode::eventFilter(watched, event); | ||
494 | } | 538 | } | ||
495 | 539 | | |||
496 | void SidebarMode::giveFocus() | 540 | void SidebarMode::giveFocus() | ||
497 | { | 541 | { | ||
498 | d->quickWidget->setFocus(); | 542 | d->quickWidget->setFocus(); | ||
499 | } | 543 | } | ||
500 | 544 | | |||
501 | #include "SidebarMode.moc" | 545 | #include "SidebarMode.moc" |
either rootObject()->metaObject()->method("")->invoke();
or
QMetaObject::invoke()
getting the right object to call a static method on isn't worth it.