From abee7cd42ffa9c4fe6e789f6ceb98d7b695f8c72 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Fri, 16 Dec 2016 01:47:39 +0300 Subject: Fix hiding tabs in skill dialog. --- src/gui/widgets/tabbedarea.cpp | 50 ++++++++++++++++++++++++++++++++--------- src/gui/widgets/tabbedarea.h | 2 ++ src/gui/windows/skilldialog.cpp | 11 ++++++++- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/gui/widgets/tabbedarea.cpp b/src/gui/widgets/tabbedarea.cpp index fa874133b..9c45226ed 100644 --- a/src/gui/widgets/tabbedarea.cpp +++ b/src/gui/widgets/tabbedarea.cpp @@ -238,7 +238,7 @@ void TabbedArea::addTab(Tab *const tab, mTabContainer->add(tab); mTabs.push_back(std::pair(tab, widget)); - if (!mSelectedTab) + if (!mSelectedTab && tab->mVisible == Visible_true) setSelectedTab(tab); adjustTabPositions(); @@ -248,6 +248,7 @@ void TabbedArea::addTab(Tab *const tab, widget->setSize(getWidth() - frameSize, getHeight() - frameSize - mTabContainer->getHeight()); + widgetResized(Event(nullptr)); updateTabsWidth(); updateArrowEnableState(); } @@ -419,6 +420,23 @@ void TabbedArea::setSelectedTab(Tab *const tab) widgetResized(Event(nullptr)); } +void TabbedArea::setSelectedTabDefault() +{ + if (mSelectedTab == nullptr || + mSelectedTab->mVisible == Visible_false) + { + for (size_t i = 0; i < mTabs.size(); i++) + { + Tab *const tab = mTabs[i].first; + if (tab && tab->mVisible == Visible_true) + { + setSelectedTab(tab); + return; + } + } + } +} + int TabbedArea::getSelectedTabIndex() const { for (unsigned int i = 0, fsz = CAST_U32(mTabs.size()); @@ -492,9 +510,13 @@ void TabbedArea::widgetResized(const Event &event A_UNUSED) int newWidth = mVisibleTabsWidth; while (mTabScrollIndex && newWidth < innerWidth) { - newWidth += mTabs[mTabScrollIndex - 1].first->getWidth(); - if (newWidth < innerWidth) - --mTabScrollIndex; + Tab *const tab = mTabs[mTabScrollIndex - 1].first; + if (tab && tab->mVisible == Visible_true) + { + newWidth += tab->getWidth(); + if (newWidth < innerWidth) + --mTabScrollIndex; + } } if (mArrowButton[1]) @@ -516,8 +538,9 @@ void TabbedArea::updateTabsWidth() mTabsWidth = 0; FOR_EACH (TabContainer::const_iterator, itr, mTabs) { - if ((*itr).first) - mTabsWidth += (*itr).first->getWidth(); + Tab *const tab = (*itr).first; + if (tab && tab->mVisible == Visible_true) + mTabsWidth += tab->getWidth(); } updateVisibleTabsWidth(); } @@ -527,8 +550,9 @@ void TabbedArea::updateVisibleTabsWidth() mVisibleTabsWidth = 0; for (size_t i = mTabScrollIndex, sz = mTabs.size(); i < sz; ++i) { - if (mTabs[i].first) - mVisibleTabsWidth += CAST_S32(mTabs[i].first->getWidth()); + Tab *const tab = mTabs[i].first; + if (tab && tab->mVisible == Visible_true) + mVisibleTabsWidth += CAST_S32(tab->getWidth()); } } @@ -576,8 +600,12 @@ void TabbedArea::adjustTabPositions() for (size_t i = 0; i < sz; ++i) { const Tab *const tab = mTabs[i].first; - if (tab && tab->getHeight() > maxTabHeight) + if (tab && + tab->mVisible == Visible_true && + tab->getHeight() > maxTabHeight) + { maxTabHeight = tab->getHeight(); + } } int x = (mEnableScrollButtons && mArrowButton[0]->mVisible == Visible_true) @@ -585,7 +613,7 @@ void TabbedArea::adjustTabPositions() for (size_t i = mTabScrollIndex; i < sz; ++i) { Tab *const tab = mTabs[i].first; - if (!tab) + if (!tab || tab->mVisible == Visible_false) continue; tab->setPosition(x, maxTabHeight - tab->getHeight()); x += tab->getWidth(); @@ -598,7 +626,7 @@ void TabbedArea::adjustTabPositions() for (unsigned i = 0; i < mTabScrollIndex; ++i) { Tab *const tab = mTabs[i].first; - if (tab) + if (tab && tab->mVisible == Visible_true) { x -= tab->getWidth(); tab->setPosition(x, maxTabHeight - tab->getHeight()); diff --git a/src/gui/widgets/tabbedarea.h b/src/gui/widgets/tabbedarea.h index 6d8bc84d2..e2d88eacf 100644 --- a/src/gui/widgets/tabbedarea.h +++ b/src/gui/widgets/tabbedarea.h @@ -167,6 +167,8 @@ class TabbedArea final : public ActionListener, void setSelectedTab(Tab *const tab); + void setSelectedTabDefault(); + void setSelectedTabByIndex(const size_t index); int getSelectedTabIndex() const A_WARN_UNUSED; diff --git a/src/gui/windows/skilldialog.cpp b/src/gui/windows/skilldialog.cpp index a18ab3b3e..d273d8453 100644 --- a/src/gui/windows/skilldialog.cpp +++ b/src/gui/windows/skilldialog.cpp @@ -145,7 +145,10 @@ void SkillDialog::addDefaultTab() // TRANSLATORS: unknown skills tab name mDefaultTab = new SkillTab(this, _("Unknown"), listbox); mDeleteTabs.push_back(mDefaultTab); + mDefaultTab->setVisible(Visible_false); mTabs->addTab(mDefaultTab, scroll); + mTabs->adjustTabPositions(); + mTabs->setSelectedTabDefault(); } void SkillDialog::action(const ActionEvent &event) @@ -403,11 +406,11 @@ void SkillDialog::loadXmlFile(const std::string &fileName, mDefaultTab = tab; } + mDeleteTabs.push_back(tab); if (alwaysVisible == true) tab->setVisible(Visible_true); else tab->setVisible(Visible_false); - mDeleteTabs.push_back(tab); mTabs->addTab(tab, scroll); for_each_xml_child_node(node, set) @@ -602,7 +605,11 @@ bool SkillDialog::updateSkill(const int id, info->sp = sp; info->update(); if (info->tab) + { info->tab->setVisible(Visible_true); + mTabs->adjustTabPositions(); + mTabs->setSelectedTabDefault(); + } } return true; } @@ -655,6 +662,8 @@ void SkillDialog::addSkill(const SkillOwner::Type owner, skill->tab = mDefaultTab; mDefaultModel->addSkill(skill); mDefaultTab->setVisible(Visible_true); + mTabs->adjustTabPositions(); + mTabs->setSelectedTabDefault(); mSkills[id] = skill; mDefaultModel->updateVisibilities(); -- cgit v1.2.3-60-g2f50