47 #if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT) 48 #error "Only <final/final.h> can be included directly." 52 #include <unordered_map> 54 #include "final/fwidget.h" 55 #include "final/widget/fscrollbar.h" 61 void setPrintArea (FWidget&, FVTerm::FTermArea*);
71 using FWidget::delAccelerator;
73 using FWidget::setGeometry;
94 auto getClassName()
const ->
FString override;
96 auto getViewportWidth()
const -> std::size_t;
97 auto getViewportHeight()
const -> std::size_t;
98 auto getViewportSize()
const ->
FSize;
99 auto getScrollWidth()
const -> std::size_t;
100 auto getScrollHeight()
const -> std::size_t;
101 auto getScrollSize()
const ->
FSize;
102 auto getScrollPos()
const ->
FPoint;
103 auto getScrollX()
const -> int;
104 auto getScrollY()
const -> int;
107 virtual void setScrollWidth (std::size_t);
108 virtual void setScrollHeight (std::size_t);
109 virtual void setScrollSize (
const FSize&);
110 void setX (
int,
bool =
true)
override;
111 void setY (
int,
bool =
true)
override;
112 void setPos (
const FPoint&,
bool =
true)
override;
113 void setWidth (std::size_t,
bool =
true)
override;
114 void setHeight (std::size_t,
bool =
true)
override;
115 void setSize (
const FSize&,
bool =
true)
override;
117 ,
bool =
true )
override;
118 auto setCursorPos (
const FPoint&) ->
bool override;
119 void setPrintPos (
const FPoint&)
override;
121 void setViewportPrint (
bool =
true);
122 void unsetViewportPrint();
123 void resetColors()
override;
124 void setBorder (
bool =
true);
126 void setHorizontalScrollBarMode (ScrollBarMode);
127 void setVerticalScrollBarMode (ScrollBarMode);
130 auto hasBorder()
const -> bool;
131 auto isViewportPrint()
const -> bool;
134 void clearArea (
wchar_t = L
' ')
override;
135 void scrollToX (
int);
136 void scrollToY (
int);
137 void scrollTo (
const FPoint&);
138 void scrollTo (
int,
int);
139 void scrollBy (
int,
int);
140 void print (
const FPoint&)
override;
141 void draw()
override;
142 void drawBorder()
override;
159 using FVTerm::clearArea;
162 auto getPrintArea() -> FTermArea*
override;
165 void setHotkeyAccelerator();
166 void initLayout()
override;
167 void adjustSize()
override;
172 using KeyMap = std::unordered_map<FKey, std::function<void()>,
EnumHash<FKey>>;
175 static constexpr std::size_t vertical_border_spacing = 2;
176 static constexpr std::size_t horizontal_border_spacing = 2;
179 auto getViewportCursorPos() ->
FPoint;
183 void addLocalPreprocessingHandler();
184 void createViewport (
const FSize&) noexcept;
185 void drawText (
const FString&, std::size_t);
186 auto getDisplayedTextLength (
const FString&,
const std::size_t)
const -> std::size_t;
187 void setLabelStyle()
const;
188 void printLabel (
const FString&, std::size_t);
189 void printEllipsis (
const FString&);
191 void mapKeyFunctions();
192 void changeSize (
const FSize&,
bool);
193 void adjustOffsets (
int,
int,
int,
int);
194 auto isChangePosition (
const int,
const int)
const -> bool;
195 auto isChangeXPosition (
const int)
const -> bool;
196 auto isChangeYPosition (
const int)
const -> bool;
197 void changeX (
const std::size_t,
const int);
198 void changeY (
const std::size_t,
const int);
199 void calculateScrollbarPos()
const;
200 template <
typename Callback>
201 void initScrollbar (FScrollbarPtr&, Orientation, Callback);
202 void setHorizontalScrollBarVisibility()
const;
203 void setVerticalScrollBarVisibility()
const;
204 void setViewportCursor();
205 auto shouldUpdateScrollbar (FScrollbar::ScrollType)
const -> bool;
206 auto getVerticalScrollDistance (
const FScrollbar::ScrollType)
const -> int;
207 auto getHorizontalScrollDistance (
const FScrollbar::ScrollType)
const -> int;
210 void cb_vbarChange (
const FWidget*);
211 void cb_hbarChange (
const FWidget*);
214 FRect scroll_geometry{1, 1, 1, 1};
215 FRect viewport_geometry{};
216 std::unique_ptr<FTermArea> viewport{};
218 FScrollbarPtr vbar{
nullptr};
219 FScrollbarPtr hbar{
nullptr};
222 bool use_own_print_area{
false};
223 bool update_scrollbar{
true};
224 ScrollBarMode v_mode{ScrollBarMode::Auto};
225 ScrollBarMode h_mode{ScrollBarMode::Auto};
230 inline auto FScrollView::getText() & ->
FString&
234 inline auto FScrollView::getClassName()
const ->
FString 235 {
return "FScrollView"; }
238 inline auto FScrollView::getViewportWidth()
const -> std::size_t
240 return ( getScrollHeight() > getViewportHeight() )
241 ?
static_cast<std::size_t
>(std::max (1, getGeometry().getX2() -
242 (getGeometry().getX1() - 1) -
243 static_cast<int>(vertical_border_spacing) -
244 static_cast<int>(nf_offset)))
245 : static_cast<std::size_t>(std::max (1, getGeometry().getX2() -
246 (getGeometry().getX1() - 1) -
247 static_cast<int>(vertical_border_spacing)));
251 inline auto FScrollView::getViewportHeight()
const -> std::size_t
253 return static_cast<std::size_t
>(std::max (1, getGeometry().getY2() -
254 (getGeometry().getY1() - 1) -
255 static_cast<int>(horizontal_border_spacing)));
259 inline auto FScrollView::getViewportSize()
const ->
FSize 260 {
return {
FSize{getViewportWidth(), getViewportHeight()} }; }
263 inline auto FScrollView::getScrollWidth()
const -> std::size_t
264 {
return scroll_geometry.getWidth(); }
267 inline auto FScrollView::getScrollHeight()
const -> std::size_t
268 {
return scroll_geometry.getHeight(); }
271 inline auto FScrollView::getScrollSize()
const ->
FSize 272 {
return scroll_geometry.getSize(); }
275 inline auto FScrollView::getScrollPos()
const ->
FPoint 276 {
return viewport_geometry.getPos(); }
279 inline auto FScrollView::getScrollX()
const ->
int 280 {
return viewport_geometry.getX(); }
283 inline auto FScrollView::getScrollY()
const ->
int 284 {
return viewport_geometry.getY(); }
287 inline void FScrollView::unsetViewportPrint()
288 { setViewportPrint(
false); }
291 inline void FScrollView::unsetBorder()
292 { setBorder(
false); }
295 inline auto FScrollView::hasBorder()
const ->
bool 296 {
return ! getFlags().feature.no_border; }
299 inline auto FScrollView::isViewportPrint()
const ->
bool 300 {
return ! use_own_print_area; }
303 inline void FScrollView::scrollTo (
const FPoint& pos)
304 { scrollTo(pos.getX(), pos.getY()); }
307 inline void FScrollView::print (
const FPoint& pos)
309 if ( use_own_print_area )
310 FWidget::setPrintPos(pos);
316 template <
typename Callback>
317 inline void FScrollView::initScrollbar ( FScrollbarPtr& bar
319 , Callback cb_handler )
321 finalcut::initScrollbar (bar, o,
this, cb_handler);
322 FTermArea* area = FScrollView::getPrintArea();
323 finalcut::setPrintArea (*bar, area);
328 #endif // FSCROLLVIEW_H
Definition: class_template.cpp:25