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 setPrintRegion (FWidget&, FVTerm::FTermRegion*);
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
' ');
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 auto getPrintRegion() -> FTermRegion*
override;
162 void setHotkeyAccelerator();
163 void initLayout()
override;
164 void adjustSize()
override;
169 using KeyMap = std::unordered_map<FKey, std::function<void()>,
EnumHash<FKey>>;
172 static constexpr std::size_t vertical_border_spacing = 2;
173 static constexpr std::size_t horizontal_border_spacing = 2;
176 auto getViewportCursorPos() ->
FPoint;
180 void addLocalPreprocessingHandler();
181 void createViewport (
const FSize&) noexcept;
182 void drawText (
const FString&, std::size_t);
183 auto getDisplayedTextLength (
const FString&,
const std::size_t)
const -> std::size_t;
184 void setLabelStyle()
const;
185 void printLabel (
const FString&, std::size_t);
186 void printEllipsis (
const FString&);
188 void mapKeyFunctions();
189 void changeSize (
const FSize&,
bool);
190 void adjustOffsets (
int,
int,
int,
int);
191 auto isChangePosition (
const int,
const int)
const -> bool;
192 auto isChangeXPosition (
const int)
const -> bool;
193 auto isChangeYPosition (
const int)
const -> bool;
194 void changeX (
const std::size_t,
const int);
195 void changeY (
const std::size_t,
const int);
196 void calculateScrollBarPos()
const;
197 template <
typename Callback>
198 void initScrollBar (FScrollBarPtr&, Orientation, Callback);
199 void setHorizontalScrollBarVisibility()
const;
200 void setVerticalScrollBarVisibility()
const;
201 void setViewportCursor();
202 auto shouldUpdateScrollBar (FScrollBar::ScrollType)
const -> bool;
203 auto getVerticalScrollDistance (
const FScrollBar::ScrollType)
const -> int;
204 auto getHorizontalScrollDistance (
const FScrollBar::ScrollType)
const -> int;
207 void cb_vbarChange (
const FWidget*);
208 void cb_hbarChange (
const FWidget*);
211 FRect scroll_geometry{1, 1, 1, 1};
212 FRect viewport_geometry{};
213 std::unique_ptr<FTermRegion> viewport{};
215 FScrollBarPtr vbar{
nullptr};
216 FScrollBarPtr hbar{
nullptr};
219 bool use_own_print_region{
false};
220 bool update_scroll_bar{
true};
221 ScrollBarMode v_mode{ScrollBarMode::Auto};
222 ScrollBarMode h_mode{ScrollBarMode::Auto};
227 inline auto FScrollView::getText() & ->
FString&
231 inline auto FScrollView::getClassName()
const ->
FString 232 {
return "FScrollView"; }
235 inline auto FScrollView::getViewportWidth()
const -> std::size_t
237 const auto width = std::size_t(getGeometry().getWidth());
238 const auto viewport_height = getViewportHeight();
240 if ( getScrollHeight() > viewport_height )
242 const auto total_spacing = vertical_border_spacing + std::size_t(nf_offset);
243 return width > total_spacing
244 ? width - total_spacing
248 return width > vertical_border_spacing
249 ? width - vertical_border_spacing
254 inline auto FScrollView::getViewportHeight()
const -> std::size_t
256 const auto height = std::size_t(getGeometry().getHeight());
258 if ( height <= horizontal_border_spacing )
261 return std::max<std::size_t>(1, height - horizontal_border_spacing);
265 inline auto FScrollView::getViewportSize()
const ->
FSize 266 {
return {
FSize{getViewportWidth(), getViewportHeight()} }; }
269 inline auto FScrollView::getScrollWidth()
const -> std::size_t
270 {
return scroll_geometry.getWidth(); }
273 inline auto FScrollView::getScrollHeight()
const -> std::size_t
274 {
return scroll_geometry.getHeight(); }
277 inline auto FScrollView::getScrollSize()
const ->
FSize 278 {
return scroll_geometry.getSize(); }
281 inline auto FScrollView::getScrollPos()
const ->
FPoint 282 {
return viewport_geometry.getPos(); }
285 inline auto FScrollView::getScrollX()
const ->
int 286 {
return viewport_geometry.getX(); }
289 inline auto FScrollView::getScrollY()
const ->
int 290 {
return viewport_geometry.getY(); }
293 inline void FScrollView::unsetViewportPrint()
294 { setViewportPrint(
false); }
297 inline void FScrollView::unsetBorder()
298 { setBorder(
false); }
301 inline auto FScrollView::hasBorder()
const ->
bool 302 {
return ! getFlags().feature.no_border; }
305 inline auto FScrollView::isViewportPrint()
const ->
bool 306 {
return ! use_own_print_region; }
309 inline void FScrollView::scrollTo (
const FPoint& pos)
310 { scrollTo(pos.getX(), pos.getY()); }
313 inline void FScrollView::print (
const FPoint& pos)
315 if ( use_own_print_region )
316 FWidget::setPrintPos(pos);
322 template <
typename Callback>
323 inline void FScrollView::initScrollBar ( FScrollBarPtr& bar
325 , Callback cb_handler )
327 finalcut::initScrollBar (bar, o,
this, cb_handler);
328 FTermRegion* region = FScrollView::getPrintRegion();
329 finalcut::setPrintRegion (*bar, region);
334 #endif // FSCROLLVIEW_H
Definition: class_template.cpp:25