1 /* 2 * Copyright (C) 2008 Emweb bv, Herent, Belgium. 3 * 4 * See the LICENSE file for terms of use. 5 */ 6 7 #include "Wt/WApplication.h" 8 #include "Wt/WContainerWidget.h" 9 #include "Wt/WEnvironment.h" 10 #include "Wt/WFitLayout.h" 11 #include "Wt/WLogger.h" 12 13 #include "StdGridLayoutImpl2.h" 14 #include "FlexLayoutImpl.h" 15 16 namespace Wt { 17 18 LOGGER("WFitLayout"); 19 WFitLayout()20WFitLayout::WFitLayout() 21 { 22 grid_.columns_.push_back(Impl::Grid::Section(0)); 23 grid_.rows_.push_back(Impl::Grid::Section(0)); 24 25 std::vector<Impl::Grid::Item> items; 26 items.push_back(Impl::Grid::Item()); 27 grid_.items_.push_back(std::move(items)); 28 } 29 ~WFitLayout()30WFitLayout::~WFitLayout() 31 { } 32 fitWidget(WContainerWidget * container,std::unique_ptr<WWidget> widget)33void WFitLayout::fitWidget(WContainerWidget *container, 34 std::unique_ptr<WWidget> widget) 35 { 36 std::unique_ptr<WFitLayout> l(new WFitLayout()); 37 l->addWidget(std::move(widget)); 38 container->setLayout(std::move(l)); 39 } 40 addItem(std::unique_ptr<WLayoutItem> item)41void WFitLayout::addItem(std::unique_ptr<WLayoutItem> item) 42 { 43 if (grid_.items_[0][0].item_) { 44 LOG_ERROR("addItem(): already have a widget"); 45 return; 46 } 47 48 WLayoutItem *it = item.get(); 49 grid_.items_[0][0].item_ = std::move(item); 50 itemAdded(it); 51 } 52 removeItem(WLayoutItem * item)53std::unique_ptr<WLayoutItem> WFitLayout::removeItem(WLayoutItem *item) 54 { 55 if (item == grid_.items_[0][0].item_.get()) { 56 auto result = std::move(grid_.items_[0][0].item_); 57 itemRemoved(item); 58 return result; 59 } else 60 return std::unique_ptr<WLayoutItem>(); 61 } 62 itemAt(int index)63WLayoutItem *WFitLayout::itemAt(int index) const 64 { 65 return grid_.items_[0][0].item_.get(); 66 } 67 indexOf(WLayoutItem * item)68int WFitLayout::indexOf(WLayoutItem *item) const 69 { 70 if (grid_.items_[0][0].item_.get() == item) 71 return 0; 72 else 73 return -1; 74 } 75 count()76int WFitLayout::count() const 77 { 78 return grid_.items_[0][0].item_ ? 1 : 0; 79 } 80 81 iterateWidgets(const HandleWidgetMethod & method)82void WFitLayout::iterateWidgets(const HandleWidgetMethod& method) const 83 { 84 if (grid_.items_[0][0].item_) 85 grid_.items_[0][0].item_->iterateWidgets(method); 86 } 87 setParentWidget(WWidget * parent)88void WFitLayout::setParentWidget(WWidget *parent) 89 { 90 WLayout::setParentWidget(parent); 91 92 if (parent) { 93 updateImplementation(); 94 } 95 } 96 updateImplementation()97void WFitLayout::updateImplementation() 98 { 99 if (!parentWidget()) 100 return; 101 102 bool isFlexLayout = implementationIsFlexLayout(); 103 104 if (isFlexLayout) 105 setImpl(std::make_unique<FlexLayoutImpl>(this, grid_)); 106 else 107 setImpl(std::make_unique<StdGridLayoutImpl2>(this, grid_)); 108 } 109 implementationIsFlexLayout()110bool WFitLayout::implementationIsFlexLayout() const 111 { 112 const WEnvironment &env = WApplication::instance()->environment(); 113 return preferredImplementation() == LayoutImplementation::Flex && 114 !env.agentIsIElt(10); 115 } 116 117 } 118