Skip to content

Commit

Permalink
listwidget: Various improvements
Browse files Browse the repository at this point in the history
Recalculate layout in more circumstances
Add various helper functions
  • Loading branch information
past-due committed Oct 11, 2023
1 parent ec74b44 commit 0c63b1e
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
34 changes: 34 additions & 0 deletions lib/widget/listwidget.cpp
Expand Up @@ -66,6 +66,11 @@ void TabSelectionWidget::initialize()
setNumberOfTabs(1);
}

void TabSelectionWidget::geometryChanged()
{
doLayoutAll();
}

void TabSelectionWidget::setHeight(int height)
{
setGeometry(x(), y(), width(), height);
Expand Down Expand Up @@ -302,6 +307,22 @@ void ListWidget::doLayout(size_t num)
myChildren[num]->show(page == currentPage_);
}

size_t ListWidget::firstWidgetShownIndex() const
{
return currentPage_ * widgetsPerPage();
}

size_t ListWidget::lastWidgetShownIndex() const
{
return std::min(firstWidgetShownIndex() + widgetsPerPage() - 1, myChildren.size() - 1);
}

std::shared_ptr<WIDGET> ListWidget::getWidgetAtIndex(size_t index) const
{
ASSERT_OR_RETURN(nullptr, index < myChildren.size(), "Invalid widget index: %zu", index);
return myChildren[index];
}

void ListWidget::addOnCurrentPageChangedHandler(const W_LISTWIDGET_ON_CURRENTPAGECHANGED_FUNC& handlerFunc)
{
onCurrentPageChangedHandlers.push_back(handlerFunc);
Expand Down Expand Up @@ -332,10 +353,17 @@ void ListWidget::updateNumberOfPages()
}
}

void ListWidget::geometryChanged()
{
doLayoutAll();
updateNumberOfPages();
}

void ListTabWidget::initialize()
{
attach(label = std::make_shared<W_LABEL>());
label->setFont(font_small, WZCOL_TEXT_MEDIUM);
label->setTransparentToMouse(true);
attach(tabs = TabSelectionWidget::make());
attach(widgets = std::make_shared<ListWidget>());
tabs->addOnTabChangedHandler([](TabSelectionWidget& tabsWidget, size_t currentTab) {
Expand Down Expand Up @@ -388,6 +416,12 @@ void ListTabWidget::geometryChanged()
}
}

int32_t ListTabWidget::heightOfTabsLabel() const
{
int widgets_y0 = std::max(LABEL_PADDING_Y + label->idealHeight(), tabs->height());
return widgets_y0;
}

void ListTabWidget::setTitle(const WzString& string)
{
label->setString(string);
Expand Down
17 changes: 16 additions & 1 deletion lib/widget/listwidget.h
Expand Up @@ -51,6 +51,8 @@ struct TabSelectionStyle
TabAlignment tabAlignment = TabAlignment::LeftAligned;
};

class ListWidget;

class TabSelectionWidget : public WIDGET
{
protected:
Expand Down Expand Up @@ -87,8 +89,13 @@ class TabSelectionWidget : public WIDGET
void prevTabPage();
void nextTabPage();

private:
protected:
void geometryChanged() override;

protected:
friend class ListWidget;
void doLayoutAll();
private:

std::vector<TabSelectionStyle> styles;
size_t currentTab;
Expand Down Expand Up @@ -126,6 +133,9 @@ class ListWidget : public WIDGET
{
return myChildren.size();
}
size_t firstWidgetShownIndex() const;
size_t lastWidgetShownIndex() const;
std::shared_ptr<WIDGET> getWidgetAtIndex(size_t index) const;

/* The optional "onCurrentPageChanged" callback function */
typedef std::function<void (ListWidget& psWidget, size_t currentPage)> W_LISTWIDGET_ON_CURRENTPAGECHANGED_FUNC;
Expand All @@ -136,6 +146,9 @@ class ListWidget : public WIDGET
void addOnCurrentPageChangedHandler(const W_LISTWIDGET_ON_CURRENTPAGECHANGED_FUNC& handlerFunc);
void addOnNumberOfPagesChangedHandler(const W_LISTWIDGET_ON_NUMBEROFPAGESCHANGED_FUNC& handlerFunc);

protected:
void geometryChanged() override;

public:
void setCurrentPage(size_t page);

Expand Down Expand Up @@ -231,6 +244,8 @@ class ListTabWidget : public WIDGET
return widgets.get();
}

int32_t heightOfTabsLabel() const;

void goToChildPage(size_t childIndex)
{
setCurrentPage(childIndex / widgets->widgetsPerPage());
Expand Down

0 comments on commit 0c63b1e

Please sign in to comment.