46 #if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT) 47 #error "Only <final/final.h> can be included directly." 55 #include <unordered_map> 60 #include "final/fwidgetcolors.h" 61 #include "final/fwidget.h" 62 #include "final/util/fstring.h" 63 #include "final/util/fstringstream.h" 64 #include "final/vterm/fcolorpair.h" 65 #include "final/vterm/fstyle.h" 66 #include "final/widget/fscrollbar.h" 75 using FScrollBarPtr = std::shared_ptr<FScrollBar>;
87 static constexpr std::size_t EOL = std::numeric_limits<std::size_t>::max();
103 auto wc_dialog = getColorTheme()->dialog;
104 attributes.color = {wc_dialog.fg, wc_dialog.bg};
105 attributes.attr = s.toFAttribute();
116 attributes.color = {c, getColorTheme()->dialog.bg};
117 attributes.attr = s.toFAttribute();
129 {cpair.getForegroundColor(), cpair.getBackgroundColor()};
130 attributes.attr = s.toFAttribute();
139 std::size_t length{};
147 , highlight{std::move(v)}
151 std::vector<FTextHighlight> highlight{};
155 using FTextViewList = std::vector<FTextViewLine>;
156 using FWidget::setGeometry;
160 FTextViewList::size_type row{UNINITIALIZED_ROW};
161 FString::size_type column{UNINITIALIZED_COLUMN};
172 template <
typename typeT>
173 auto operator << (
const typeT&) ->
FTextView&;
174 auto operator << (
const UniChar&) ->
FTextView&;
175 auto operator << (
const std::string&) ->
FTextView&;
178 auto getClassName()
const ->
FString override;
179 auto getColumns()
const noexcept -> std::size_t;
180 auto getRows()
const -> std::size_t;
181 auto getScrollPos()
const ->
FPoint;
182 auto getTextVisibleSize()
const ->
FSize;
183 auto getText()
const ->
FString;
184 auto getSelectedText()
const ->
FString;
188 auto getLine (FTextViewList::size_type)
const ->
const FTextViewLine&;
189 auto getLines()
const & ->
const FTextViewList&;
192 void setSize (
const FSize&,
bool =
true)
override;
193 void setGeometry (
const FPoint&,
const FSize&,
bool =
true)
override;
194 void resetColors()
override;
197 void resetHighlight (std::size_t);
198 void setSelectionStart (
const FTextViewList::size_type,
const FString::size_type);
199 void setSelectionEnd (
const FTextViewList::size_type,
const FString::size_type);
200 void resetSelection();
201 template <
typename T>
203 void setSelectable (
bool =
true);
204 void unsetSelectable();
205 void scrollToX (
int);
206 void scrollToY (
int);
207 void scrollTo (
const FPoint&);
208 void scrollTo (
int,
int);
209 void scrollToBegin();
211 void scrollBy (
int,
int);
214 auto hasSelectedText()
const -> bool;
215 auto isSelectable()
const -> bool;
218 void hide()
override;
220 template <
typename T>
221 void append (
const std::initializer_list<T>&);
223 template <
typename T>
224 void insert (
const std::initializer_list<T>&,
int);
225 void insert (
const FString&,
int);
226 void replaceRange (
const FString&,
int,
int);
227 void deleteRange (
int,
int);
228 void deleteLine (
int);
241 void initLayout()
override;
242 void adjustSize()
override;
245 auto isHorizontallyScrollable()
const -> bool;
246 auto isVerticallyScrollable()
const -> bool;
249 auto getTextHeight()
const -> std::size_t;
250 auto getTextWidth()
const -> std::size_t;
254 static constexpr
auto UNINITIALIZED_ROW =
static_cast<FTextViewList::size_type
>(-1);
255 static constexpr
auto UNINITIALIZED_COLUMN =
static_cast<FString::size_type
>(-1);
258 using KeyMap = std::unordered_map<FKey, std::function<void()>,
EnumHash<FKey>>;
261 auto isWithinTextBounds (
const FPoint&)
const -> bool;
262 auto isLowerRightResizeCorner (
const FPoint&)
const -> bool;
263 auto hasWrongSelectionOrder()
const -> bool;
267 void mapKeyFunctions();
268 void draw()
override;
269 void drawBorder()
override;
270 void drawScrollBars()
const;
272 auto canSkipDrawing()
const -> bool;
273 void printLine (std::size_t);
275 ,
const std::vector<FTextHighlight>& )
const;
277 auto useFDialogBorder()
const -> bool;
278 auto isPrintable (
wchar_t)
const -> bool;
279 auto splitTextLines (
const FString&)
const -> FStringList;
280 void processLine (
FString&&,
int);
281 template<
typename T1,
typename T2>
282 void setSelectionStartInt (T1&&, T2&&);
283 template<
typename T1,
typename T2>
284 void setSelectionEndInt (T1&&, T2&&);
285 auto getScrollBarMaxHorizontal()
const noexcept -> int;
286 auto getScrollBarMaxVertical()
const noexcept -> int;
287 void updateVerticalScrollBar()
const;
288 void updateHorizontalScrollBar (std::size_t);
289 auto convertMouse2TextPos (
const FPoint&)
const ->
FPoint;
290 void handleMouseWithinListBounds (
const FPoint&);
292 void handleLeftDragScroll();
293 void handleRightDragScroll();
294 void handleUpDragScroll();
295 void handleDownDragScroll();
300 void stopDragScroll();
301 void processChanged()
const;
302 void changeOnResize()
const;
303 auto shouldUpdateScrollBar (FScrollBar::ScrollType)
const -> bool;
304 auto getVerticalScrollDistance (
const FScrollBar::ScrollType)
const -> int;
305 auto getHorizontalScrollDistance (
const FScrollBar::ScrollType)
const -> int;
308 void cb_vbarChange (
const FWidget*);
309 void cb_hbarChange (
const FWidget*);
312 FTextViewList data{};
313 FScrollBarPtr vbar{
nullptr};
314 FScrollBarPtr hbar{
nullptr};
317 FPoint select_click_pos{-1, -1};
319 DragScrollMode drag_scroll{DragScrollMode::None};
320 bool update_scroll_bar{
true};
321 bool pass_to_dialog{
false};
322 bool selectable{
false};
323 int scroll_repeat{100};
327 std::size_t max_line_width{0};
339 template <
typename typeT>
340 inline auto FTextView::operator << (
const typeT& s) ->
FTextView&
345 if ( ! outstream.str().isEmpty() )
346 append (outstream.str());
352 inline auto FTextView::operator << (
const UniChar& c) ->
FTextView&
354 append (static_cast<wchar_t>(c));
359 inline auto FTextView::operator << (
const std::string&
string) ->
FTextView&
366 inline auto FTextView::getClassName()
const ->
FString 367 {
return "FTextView"; }
370 inline auto FTextView::getColumns()
const noexcept -> std::size_t
371 {
return max_line_width; }
374 inline auto FTextView::getRows()
const -> std::size_t
375 {
return data.size(); }
378 inline auto FTextView::getScrollPos()
const ->
FPoint 379 {
return {xoffset, yoffset}; }
382 inline auto FTextView::getTextVisibleSize()
const ->
FSize 383 {
return {
FSize{getTextWidth(), getTextHeight()} }; }
386 inline auto FTextView::getSelectionStart()
const ->
FTextPosition 387 {
return selection_start; }
390 inline auto FTextView::getSelectionEnd()
const ->
FTextPosition 391 {
return selection_end; }
394 inline auto FTextView::getLine (FTextViewList::size_type line) ->
FTextViewLine&
395 {
return data.at(line); }
398 inline auto FTextView::getLine (FTextViewList::size_type line)
const ->
const FTextViewLine&
399 {
return data.at(line); }
402 inline auto FTextView::getLines()
const & ->
const FTextViewList&
406 inline void FTextView::setSelectionStart (
const FTextViewList::size_type row
407 ,
const FString::size_type col )
408 { selection_start = {row, col}; }
411 inline void FTextView::setSelectionEnd (
const FTextViewList::size_type row
412 ,
const FString::size_type col )
413 { selection_end = {row, col}; }
416 inline void FTextView::resetSelection()
418 selection_start = {UNINITIALIZED_ROW, UNINITIALIZED_COLUMN};
419 selection_end = {UNINITIALIZED_ROW, UNINITIALIZED_COLUMN};
423 template <
typename T>
424 inline void FTextView::setLines (T&& list)
427 data = std::forward<T>(list);
428 updateVerticalScrollBar();
433 inline void FTextView::setSelectable (
bool enable)
434 { selectable = enable; }
437 inline void FTextView::unsetSelectable()
438 { selectable =
false; }
441 inline void FTextView::scrollTo (
const FPoint& pos)
442 { scrollTo(pos.getX(), pos.getY()); }
445 inline auto FTextView::hasSelectedText()
const ->
bool 447 return selection_start.row != UNINITIALIZED_ROW
448 && selection_end.row != UNINITIALIZED_ROW
449 && selection_start.column != UNINITIALIZED_COLUMN
450 && selection_end.column != UNINITIALIZED_COLUMN;
454 inline auto FTextView::isSelectable()
const ->
bool 455 {
return selectable; }
458 template <
typename T>
459 void FTextView::append (
const std::initializer_list<T>& list)
461 for (
const auto& str : list)
466 template <
typename T>
467 void FTextView::insert (
const std::initializer_list<T>& list,
int pos)
469 for (
const auto& str : list)
477 inline void FTextView::deleteLine (
int pos)
478 { deleteRange (pos, pos); }
481 inline auto FTextView::isHorizontallyScrollable()
const ->
bool 482 {
return max_line_width > getTextWidth(); }
485 inline auto FTextView::isVerticallyScrollable()
const ->
bool 486 {
return getRows() > getTextHeight(); }
489 template<
typename T1,
typename T2>
490 inline void FTextView::setSelectionStartInt (T1&& row, T2&& col)
492 selection_start = {
static_cast<const FTextViewList::size_type
>(std::forward<T1>(row))
493 ,
static_cast<const FString::size_type
>(std::forward<T2>(col)) };
497 template<
typename T1,
typename T2>
498 inline void FTextView::setSelectionEndInt (T1&& row, T2&& col)
500 selection_end = {
static_cast<const FTextViewList::size_type
>(std::forward<T1>(row))
501 ,
static_cast<const FString::size_type
>(std::forward<T2>(col)) };
506 #endif // FTEXTVIEW_H Definition: ftextview.h:81
Definition: fvtermbuffer.h:56
Definition: class_template.cpp:25
Definition: ftypes.h:1081
Definition: ftextview.h:158
Definition: ftextview.h:84
Definition: fstringstream.h:56
Definition: fcolorpair.h:49
Definition: ftextview.h:143