void RadioButtonGroup::InsertButton(std::size_t index, StateButton* bn) { assert(index <= m_button_slots.size()); if (!m_expand_buttons) { Pt min_usable_size = bn->MinUsableSize(); bn->Resize(Pt(std::max(bn->Width(), min_usable_size.x), std::max(bn->Height(), min_usable_size.y))); } Pt bn_sz = bn->Size(); Layout* layout = GetLayout(); if (!layout) { layout = new Layout(X0, Y0, ClientWidth(), ClientHeight(), 1, 1); SetLayout(layout); } const int CELLS_PER_BUTTON = m_expand_buttons ? 1 : 2; const int X_STRETCH = (m_expand_buttons && m_expand_buttons_proportionally) ? Value(bn_sz.x) : 1; const int Y_STRETCH = (m_expand_buttons && m_expand_buttons_proportionally) ? Value(bn_sz.y) : 1; if (m_button_slots.empty()) { layout->Add(bn, 0, 0); if (m_expand_buttons) { if (m_orientation == VERTICAL) layout->SetRowStretch(0, Y_STRETCH); else layout->SetColumnStretch(0, X_STRETCH); } } else { if (m_orientation == VERTICAL) { layout->ResizeLayout(layout->Rows() + CELLS_PER_BUTTON, 1); layout->SetRowStretch(layout->Rows() - CELLS_PER_BUTTON, Y_STRETCH); } else { layout->ResizeLayout(1, layout->Columns() + CELLS_PER_BUTTON); layout->SetColumnStretch(layout->Columns() - CELLS_PER_BUTTON, X_STRETCH); } for (std::size_t i = m_button_slots.size() - 1; index <= i; --i) { layout->Remove(m_button_slots[i].button); layout->Add(m_button_slots[i].button, m_orientation == VERTICAL ? i * CELLS_PER_BUTTON + CELLS_PER_BUTTON : 0, m_orientation == VERTICAL ? 0 : i * CELLS_PER_BUTTON + CELLS_PER_BUTTON); if (m_orientation == VERTICAL) layout->SetMinimumRowHeight(i * CELLS_PER_BUTTON + CELLS_PER_BUTTON, layout->MinimumRowHeight(i * CELLS_PER_BUTTON)); else layout->SetMinimumColumnWidth(i * CELLS_PER_BUTTON + CELLS_PER_BUTTON, layout->MinimumColumnWidth(i * CELLS_PER_BUTTON)); } layout->Add(bn, m_orientation == VERTICAL ? index * CELLS_PER_BUTTON : 0, m_orientation == VERTICAL ? 0 : index * CELLS_PER_BUTTON); } if (m_orientation == VERTICAL) layout->SetMinimumRowHeight(index * CELLS_PER_BUTTON, bn_sz.y); else layout->SetMinimumColumnWidth(index * CELLS_PER_BUTTON, bn_sz.x); m_button_slots.insert(m_button_slots.begin() + index, ButtonSlot(bn)); if (m_checked_button != NO_BUTTON && index <= m_checked_button) ++m_checked_button; Reconnect(); }
void ThreeButtonDlg::Init(const std::string& msg, const boost::shared_ptr<Font>& font, std::size_t buttons, const std::string& zero/* = ""*/, const std::string& one/* = ""*/, const std::string& two/* = ""*/) { if (buttons < 1) buttons = 1; else if (3 < buttons) buttons = 3; const int SPACING = 10; const Y BUTTON_HEIGHT = font->Height() + 10; Layout* layout = new Layout(X0, Y0, X1, Y1, 2, 1, 10); Layout* button_layout = new Layout(X0, Y0, X1, Y1, 1, buttons, 0, 10); boost::shared_ptr<StyleFactory> style = GetStyleFactory(); TextControl* message_text = style->NewTextControl(X0, Y0, ClientWidth() - 2 * SPACING, Height(), msg, font, m_text_color, FORMAT_CENTER | FORMAT_VCENTER | FORMAT_WORDBREAK); message_text->SetMinSize(true); layout->Add(message_text, 0, 0); layout->SetRowStretch(0, 1); layout->SetMinimumRowHeight(1, BUTTON_HEIGHT); m_button_0 = style->NewButton(X0, Y0, X1, Y1, (zero == "" ? (buttons < 3 ? "Ok" : "Yes") : zero), font, m_button_color, m_text_color); button_layout->Add(m_button_0, 0, 0); if (2 <= buttons) { m_button_1 = style->NewButton(X0, Y0, X1, Y1, (one == "" ? (buttons < 3 ? "Cancel" : "No") : one), font, m_button_color, m_text_color); button_layout->Add(m_button_1, 0, 1); } if (3 <= buttons) { m_button_2 = style->NewButton(X0, Y0, X1, Y1, (two == "" ? "Cancel" : two), font, m_button_color, m_text_color); button_layout->Add(m_button_2, 0, 2); } layout->Add(button_layout, 1, 0); SetLayout(layout); ConnectSignals(); }
void RadioButtonGroup::RemoveButton(StateButton* button) { std::size_t index = NO_BUTTON; for (std::size_t i = 0; i < m_button_slots.size(); ++i) { if (m_button_slots[i].button == button) { index = i; break; } } assert(index < m_button_slots.size()); const int CELLS_PER_BUTTON = m_expand_buttons ? 1 : 2; Layout* layout = GetLayout(); layout->Remove(m_button_slots[index].button); for (std::size_t i = index + 1; i < m_button_slots.size(); ++i) { layout->Remove(m_button_slots[i].button); if (m_orientation == VERTICAL) { layout->Add(m_button_slots[i].button, i * CELLS_PER_BUTTON - CELLS_PER_BUTTON, 0); layout->SetRowStretch(i * CELLS_PER_BUTTON - CELLS_PER_BUTTON, layout->RowStretch(i * CELLS_PER_BUTTON)); layout->SetMinimumRowHeight(i * CELLS_PER_BUTTON - CELLS_PER_BUTTON, layout->MinimumRowHeight(i * CELLS_PER_BUTTON)); } else { layout->Add(m_button_slots[i].button, 0, i * CELLS_PER_BUTTON - CELLS_PER_BUTTON); layout->SetColumnStretch(i * CELLS_PER_BUTTON - CELLS_PER_BUTTON, layout->ColumnStretch(i * CELLS_PER_BUTTON)); layout->SetMinimumColumnWidth(i * CELLS_PER_BUTTON - CELLS_PER_BUTTON, layout->MinimumColumnWidth(i * CELLS_PER_BUTTON)); } } m_button_slots[index].connection.disconnect(); m_button_slots.erase(m_button_slots.begin() + index); if (m_button_slots.empty()) { layout->ResizeLayout(1, 1); } else { if (m_orientation == VERTICAL) layout->ResizeLayout(layout->Rows() - CELLS_PER_BUTTON, 1); else layout->ResizeLayout(1, layout->Columns() - CELLS_PER_BUTTON); } if (index == m_checked_button) m_checked_button = NO_BUTTON; else if (index <= m_checked_button) --m_checked_button; Reconnect(); }
void OverlayWnd::SetCurrentWnd(std::size_t index) { assert(index < m_wnds.size()); Wnd* old_current_wnd = CurrentWnd(); m_current_wnd_index = index; Wnd* current_wnd = CurrentWnd(); if (current_wnd != old_current_wnd) { Layout* layout = GetLayout(); layout->Remove(old_current_wnd); layout->Add(current_wnd, 0, 0); } }
TabWnd::TabWnd(X x, Y y, X w, Y h, const boost::shared_ptr<Font>& font, Clr color, Clr text_color/* = CLR_BLACK*/, TabBarStyle style/* = TAB_BAR_ATTACHED*/) : Wnd(x, y, w, h, INTERACTIVE), m_tab_bar(GetStyleFactory()->NewTabBar(font, color, text_color, style)), m_overlay(new OverlayWnd(X0, Y0, X1, Y1)) { Layout* layout = new Layout(X0, Y0, w, h, 2, 1); layout->SetRowStretch(1, 1.0); layout->Add(m_tab_bar, 0, 0); layout->Add(m_overlay, 1, 0); SetLayout(layout); Connect(m_tab_bar->TabChangedSignal, boost::bind(&TabWnd::TabChanged, this, _1, true)); if (INSTRUMENT_ALL_SIGNALS) Connect(WndChangedSignal, TabChangedEcho("TabWnd::WndChangedSignal")); }