Correct searchbox, split view transitions between tabs

Differential Revision: https://phabricator.kde.org/D5864

BUG: 379135
BUG: 380032
FIXED-IN: 17.04.2

Signed-off-by: Anthony Fieroni <bvbfan@abv.bg>
This commit is contained in:
Anthony Fieroni 2017-05-22 20:35:29 +03:00
parent 73f885f9d3
commit 43da84eefc
4 changed files with 44 additions and 17 deletions

View file

@ -28,7 +28,8 @@
DolphinTabPage::DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl, QWidget* parent) : DolphinTabPage::DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl, QWidget* parent) :
QWidget(parent), QWidget(parent),
m_primaryViewActive(true), m_primaryViewActive(true),
m_splitViewEnabled(false) m_splitViewEnabled(false),
m_active(true)
{ {
QVBoxLayout* layout = new QVBoxLayout(this); QVBoxLayout* layout = new QVBoxLayout(this);
layout->setSpacing(0); layout->setSpacing(0);
@ -286,17 +287,31 @@ void DolphinTabPage::restoreStateV1(const QByteArray& state)
m_splitter->restoreState(splitterState); m_splitter->restoreState(splitterState);
} }
void DolphinTabPage::setActive(bool active)
{
if (active) {
m_active = active;
} else {
// we should bypass changing active view in split mode
m_active = !m_splitViewEnabled;
}
// we want view to fire activated when goes from false to true
activeViewContainer()->setActive(active);
}
void DolphinTabPage::slotViewActivated() void DolphinTabPage::slotViewActivated()
{ {
const DolphinView* oldActiveView = activeViewContainer()->view(); const DolphinView* oldActiveView = activeViewContainer()->view();
// Set the view, which was active before, to inactive // Set the view, which was active before, to inactive
// and update the active view type. // and update the active view type, if tab is active
if (m_splitViewEnabled) { if (m_active) {
activeViewContainer()->setActive(false); if (m_splitViewEnabled) {
m_primaryViewActive = !m_primaryViewActive; activeViewContainer()->setActive(false);
} else { m_primaryViewActive = !m_primaryViewActive;
m_primaryViewActive = true; } else {
m_primaryViewActive = true;
}
} }
const DolphinView* newActiveView = activeViewContainer()->view(); const DolphinView* newActiveView = activeViewContainer()->view();

View file

@ -129,6 +129,12 @@ public:
*/ */
void restoreStateV1(const QByteArray& state); void restoreStateV1(const QByteArray& state);
/**
* Set whether the tab page is active
*
*/
void setActive(bool active);
signals: signals:
void activeViewChanged(DolphinViewContainer* viewContainer); void activeViewChanged(DolphinViewContainer* viewContainer);
void activeViewUrlChanged(const QUrl& url); void activeViewUrlChanged(const QUrl& url);
@ -165,6 +171,7 @@ private:
bool m_primaryViewActive; bool m_primaryViewActive;
bool m_splitViewEnabled; bool m_splitViewEnabled;
bool m_active;
}; };
#endif // DOLPHIN_TAB_PAGE_H #endif // DOLPHIN_TAB_PAGE_H

View file

@ -33,7 +33,7 @@
DolphinTabWidget::DolphinTabWidget(QWidget* parent) : DolphinTabWidget::DolphinTabWidget(QWidget* parent) :
QTabWidget(parent), QTabWidget(parent),
m_placesSelectorVisible(true), m_placesSelectorVisible(true),
m_previousTab(-1) m_previousTab(0)
{ {
connect(this, &DolphinTabWidget::tabCloseRequested, connect(this, &DolphinTabWidget::tabCloseRequested,
this, static_cast<void (DolphinTabWidget::*)(int)>(&DolphinTabWidget::closeTab)); this, static_cast<void (DolphinTabWidget::*)(int)>(&DolphinTabWidget::closeTab));
@ -304,15 +304,15 @@ void DolphinTabWidget::tabUrlChanged(const QUrl& url)
void DolphinTabWidget::currentTabChanged(int index) void DolphinTabWidget::currentTabChanged(int index)
{ {
DolphinViewContainer* viewContainer = tabPageAt(index)->activeViewContainer(); // previous tab deactivation
viewContainer->setActive(true); if (DolphinTabPage* tabPage = tabPageAt(m_previousTab)) {
tabPage->setActive(false);
}
DolphinTabPage* tabPage = tabPageAt(index);
DolphinViewContainer* viewContainer = tabPage->activeViewContainer();
emit activeViewChanged(viewContainer); emit activeViewChanged(viewContainer);
emit currentUrlChanged(viewContainer->url()); emit currentUrlChanged(viewContainer->url());
viewContainer->view()->setFocus(); tabPage->setActive(true);
if (tabPageAt(m_previousTab)) {
tabPageAt(m_previousTab)->activeViewContainer()->setActive(false);
}
m_previousTab = index; m_previousTab = index;
} }

View file

@ -230,8 +230,13 @@ bool DolphinSearchBox::eventFilter(QObject* obj, QEvent* event)
{ {
switch (event->type()) { switch (event->type()) {
case QEvent::FocusIn: case QEvent::FocusIn:
setActive(true); // #379135: we get the FocusIn event when we close a tab but we don't want to emit
setFocus(); // the activated() signal before the removeTab() call in DolphinTabWidget::closeTab() returns.
// To avoid this issue, we delay the activation of the search box.
QTimer::singleShot(0, this, [this] {
setActive(true);
setFocus();
});
break; break;
default: default: