Skip to content

Commit

Permalink
UI|Home: Fixed scrolling to newly selected package; cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
skyjake committed Apr 23, 2016
1 parent 4a4a211 commit 5d15985
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 63 deletions.
4 changes: 2 additions & 2 deletions doomsday/apps/client/include/ui/widgets/homemenuwidget.h
Expand Up @@ -39,15 +39,15 @@ class HomeMenuWidget : public de::MenuWidget
/**
* Returns the selected widget's index number in the list of menu children.
*/
int selectedIndex() const;
de::ui::DataPos selectedIndex() const;

/**
* @brief setSelectedIndex
* @param index
*
* @return The highlighted widget, if one was highlighted. Otherwise, returns nullptr.
*/
void setSelectedIndex(int index);
void setSelectedIndex(de::ui::DataPos index);

signals:
void selectedIndexChanged(int index);
Expand Down
15 changes: 10 additions & 5 deletions doomsday/apps/client/src/ui/dialogs/packagesdialog.cpp
Expand Up @@ -202,7 +202,6 @@ DENG_GUI_PIMPL(PackagesDialog)

QObject::connect(menu, &HomeMenuWidget::itemClicked, [this] (int index)
{
// Update the remove button position.
if(index >= 0)
{
browser->scrollToPackage(menu->items().at(index)
Expand Down Expand Up @@ -297,13 +296,12 @@ DENG_GUI_PIMPL(PackagesDialog)
{
selectedPackages.append(packageId);
menu->items() << new SelectedPackageItem(packageId);
updateNothingIndicator();
}
else
{
removePackage(packageId);
}

updateNothingIndicator();
}

void removePackage(String const &packageId)
Expand All @@ -312,12 +310,19 @@ DENG_GUI_PIMPL(PackagesDialog)
auto pos = menu->items().findData(packageId);
DENG2_ASSERT(pos != ui::Data::InvalidPos);
menu->items().remove(pos);
updateNothingIndicator();
}

void widgetChildAdded(Widget &child)
{
menu->setSelectedIndex(menu->items().find(
*menu->organizer().findItemForWidget(child.as<GuiWidget>())));
ui::DataPos pos = menu->findItem(child.as<GuiWidget>());
// We use a delay here because ScrollAreaWidget does scrolling based on
// the current geometry of the widget and HomeItemWidget uses an animation
// for its height.
Loop::get().timer(0.3, [this, pos] ()
{
menu->setSelectedIndex(pos);
});
}
};

Expand Down
8 changes: 2 additions & 6 deletions doomsday/apps/client/src/ui/home/gamecolumnwidget.cpp
Expand Up @@ -421,17 +421,13 @@ DENG_GUI_PIMPL(GameColumnWidget)
new CallbackAction([this, button, profileItem, popup] ()
{
popup->detachAnchor();
#ifdef DENG2_QT_5_4_OR_NEWER
// Animate the widget to fade it away.
TimeDelta const SPAN = 0.2;
button->setOpacity(0, SPAN);
QTimer::singleShot(SPAN.asMilliSeconds(), [profileItem] () {
Loop::get().timer(SPAN, [profileItem] ()
{
delete profileItem->profile;
});
#else
// Oh well.
delete profileItem->profile;
#endif
}))
<< new ui::ActionItem(tr("Cancel"), new Action);

Expand Down
79 changes: 29 additions & 50 deletions doomsday/apps/client/src/ui/widgets/homemenuwidget.cpp
Expand Up @@ -25,8 +25,8 @@ DENG_GUI_PIMPL(HomeMenuWidget)
, DENG2_OBSERVES(ChildWidgetOrganizer, WidgetCreation)
, DENG2_OBSERVES(Asset, StateChange)
{
int selectedIndex = -1;
int previousSelectedIndex = 0;
ui::DataPos selectedIndex = ui::Data::InvalidPos;
ui::DataPos previousSelectedIndex = 0;

Instance(Public *i) : Base(i)
{
Expand All @@ -46,7 +46,6 @@ DENG_GUI_PIMPL(HomeMenuWidget)
thisPublic, SLOT(mouseActivityInItem()));

QObject::connect(&widget, SIGNAL(selected()), thisPublic, SLOT(itemSelectionChanged()));
//QObject::connect(&widget, SIGNAL(deselected()), thisPublic, SLOT(itemSelectionChanged()));
}
}

Expand All @@ -61,10 +60,12 @@ DENG_GUI_PIMPL(HomeMenuWidget)

void scrollToSelected()
{
if(selectedIndex >= 0 && self.hasRoot())
if(self.hasRoot())
{
self.findTopmostScrollable().scrollToWidget(
self.childWidgets().at(selectedIndex)->as<GuiWidget>());
if(auto *widget = self.itemWidget<GuiWidget>(selectedIndex))
{
self.findTopmostScrollable().scrollToWidget(*widget);
}
}
}
};
Expand All @@ -84,7 +85,7 @@ void HomeMenuWidget::unselectAll()
{
if(d->selectedIndex >= 0)
{
d->selectedIndex = -1;
d->selectedIndex = ui::Data::InvalidPos;

// Unselect all items.
for(auto *w : childWidgets())
Expand All @@ -106,73 +107,51 @@ void HomeMenuWidget::restorePreviousSelection()
setSelectedIndex(d->previousSelectedIndex);
}

int HomeMenuWidget::selectedIndex() const
ui::DataPos HomeMenuWidget::selectedIndex() const
{
return d->selectedIndex;
}

void HomeMenuWidget::setSelectedIndex(int index)
void HomeMenuWidget::setSelectedIndex(ui::DataPos index)
{
if(index >= 0 && index < childWidgets().size())
if(auto *widget = itemWidget<HomeItemWidget>(index))
{
if(HomeItemWidget *widget = childWidgets().at(index)->maybeAs<HomeItemWidget>())
{
widget->acquireFocus();
widget->acquireFocus();

// Check if we can scroll to the selected widget right away.
// If not, we are observing the asset and will scroll when it is ready.
if(assets().isReady())
{
d->scrollToSelected();
}
else
{
assets().audienceForStateChange() += d;
}
// Check if we can scroll to the selected widget right away.
// If not, we are observing the asset and will scroll when it is ready.
if(assets().isReady())
{
d->scrollToSelected();
}
else
{
assets().audienceForStateChange() += d;
}
}
}

void HomeMenuWidget::mouseActivityInItem()
{
auto *clickedItem = dynamic_cast<HomeItemWidget *>(sender());

emit itemClicked(childWidgets().indexOf(clickedItem));
/*
// Radio button behavior: other items will be deselected.
for(int i = 0; i < childWidgets().size(); ++i)
if(auto *clickedWidget = dynamic_cast<HomeItemWidget *>(sender()))
{
if(auto *item = childWidgets().at(i)->maybeAs<HomeItemWidget>())
{
item->setSelected(item == clickedItem);
if(item == clickedItem)
{
d->selectedIndex = i;
}
}
}*/
emit itemClicked(findItem(*clickedWidget));
}
}

void HomeMenuWidget::itemSelectionChanged()
{
if(auto *clickedItem = dynamic_cast<HomeItemWidget *>(sender()))
{
int const newSelection = childWidgets().indexOf(clickedItem);
ui::DataPos const newSelection = findItem(*clickedItem);
if(d->selectedIndex != newSelection)
{
if(d->selectedIndex >= 0)
// Deselect the previous selection.
if(auto *item = itemWidget<HomeItemWidget>(d->selectedIndex))
{
auto children = childWidgets();
if(d->selectedIndex < children.size())
{
// Deselect the previous selection.
if(auto *item = children.at(d->selectedIndex)->maybeAs<HomeItemWidget>())
{
item->setSelected(false);
}
}
item->setSelected(false);
}

d->selectedIndex = d->previousSelectedIndex = newSelection;

emit selectedIndexChanged(d->selectedIndex);
Expand Down

0 comments on commit 5d15985

Please sign in to comment.