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" 74 using FScrollbarPtr = std::shared_ptr<FScrollbar>;
86 static constexpr std::size_t EOL = std::numeric_limits<std::size_t>::max();
102 auto wc = getColorTheme();
103 attributes.fg_color = wc->dialog.fg;
104 attributes.bg_color = wc->dialog.bg;
105 attributes.attr = s.toFAttribute();
116 attributes.fg_color = c;
117 attributes.bg_color = getColorTheme()->dialog.bg;
118 attributes.attr = s.toFAttribute();
129 attributes.fg_color = cpair.getForegroundColor();
130 attributes.bg_color = cpair.getBackgroundColor();
131 attributes.attr = s.toFAttribute();
140 std::size_t length{};
148 , highlight{std::move(v)}
152 std::vector<FTextHighlight> highlight{};
156 using FTextViewList = std::vector<FTextViewLine>;
157 using FWidget::setGeometry;
161 FTextViewList::size_type row{UNINITIALIZED_ROW};
162 FString::size_type column{UNINITIALIZED_COLUMN};
173 template <
typename typeT>
174 auto operator << (
const typeT&) ->
FTextView&;
175 auto operator << (
const UniChar&) ->
FTextView&;
176 auto operator << (
const std::string&) ->
FTextView&;
179 auto getClassName()
const ->
FString override;
180 auto getColumns()
const noexcept -> std::size_t;
181 auto getRows()
const -> std::size_t;
182 auto getScrollPos()
const ->
FPoint;
183 auto getTextVisibleSize()
const ->
FSize;
184 auto getText()
const ->
FString;
185 auto getSelectedText()
const ->
FString;
189 auto getLine (FTextViewList::size_type)
const ->
const FTextViewLine&;
190 auto getLines()
const & ->
const FTextViewList&;
193 void setSize (
const FSize&,
bool =
true)
override;
194 void setGeometry (
const FPoint&,
const FSize&,
bool =
true)
override;
195 void resetColors()
override;
198 void resetHighlight (std::size_t);
199 void setSelectionStart (
const FTextViewList::size_type,
const FString::size_type);
200 void setSelectionEnd (
const FTextViewList::size_type,
const FString::size_type);
201 void resetSelection();
202 template <
typename T>
204 void setSelectable (
bool =
true);
205 void unsetSelectable();
206 void scrollToX (
int);
207 void scrollToY (
int);
208 void scrollTo (
const FPoint&);
209 void scrollTo (
int,
int);
210 void scrollToBegin();
212 void scrollBy (
int,
int);
215 auto hasSelectedText()
const -> bool;
216 auto isSelectable()
const -> bool;
219 void hide()
override;
221 template <
typename T>
222 void append (
const std::initializer_list<T>&);
224 template <
typename T>
225 void insert (
const std::initializer_list<T>&,
int);
226 void insert (
const FString&,
int);
227 void replaceRange (
const FString&,
int,
int);
228 void deleteRange (
int,
int);
229 void deleteLine (
int);
242 void initLayout()
override;
243 void adjustSize()
override;
246 auto isHorizontallyScrollable()
const -> bool;
247 auto isVerticallyScrollable()
const -> bool;
250 auto getTextHeight()
const -> std::size_t;
251 auto getTextWidth()
const -> std::size_t;
255 static constexpr
auto UNINITIALIZED_ROW =
static_cast<FTextViewList::size_type
>(-1);
256 static constexpr
auto UNINITIALIZED_COLUMN =
static_cast<FString::size_type
>(-1);
259 using KeyMap = std::unordered_map<FKey, std::function<void()>,
EnumHash<FKey>>;
262 auto isWithinTextBounds (
const FPoint&)
const -> bool;
263 auto isLowerRightResizeCorner (
const FPoint&)
const -> bool;
264 auto hasWrongSelectionOrder()
const -> bool;
268 void mapKeyFunctions();
269 void draw()
override;
270 void drawBorder()
override;
271 void drawScrollbars()
const;
273 auto canSkipDrawing()
const -> bool;
274 void printLine (std::size_t);
276 ,
const std::vector<FTextHighlight>& )
const;
278 auto useFDialogBorder()
const -> bool;
279 auto isPrintable (
wchar_t)
const -> bool;
280 auto splitTextLines (
const FString&)
const -> FStringList;
281 void processLine (
FString&&,
int);
282 template<
typename T1,
typename T2>
283 void setSelectionStartInt (T1&&, T2&&);
284 template<
typename T1,
typename T2>
285 void setSelectionEndInt (T1&&, T2&&);
286 auto getScrollBarMaxHorizontal()
const noexcept -> int;
287 auto getScrollBarMaxVertical()
const noexcept -> int;
288 void updateVerticalScrollBar()
const;
289 void updateHorizontalScrollBar (std::size_t);
290 auto convertMouse2TextPos (
const FPoint&)
const ->
FPoint;
291 void handleMouseWithinListBounds (
const FPoint&);
293 void handleLeftDragScroll();
294 void handleRightDragScroll();
295 void handleUpDragScroll();
296 void handleDownDragScroll();
301 void stopDragScroll();
302 void processChanged()
const;
303 void changeOnResize()
const;
304 auto shouldUpdateScrollbar (FScrollbar::ScrollType)
const -> bool;
305 auto getVerticalScrollDistance (
const FScrollbar::ScrollType)
const -> int;
306 auto getHorizontalScrollDistance (
const FScrollbar::ScrollType)
const -> int;
309 void cb_vbarChange (
const FWidget*);
310 void cb_hbarChange (
const FWidget*);
313 FTextViewList data{};
314 FScrollbarPtr vbar{
nullptr};
315 FScrollbarPtr hbar{
nullptr};
318 FPoint select_click_pos{-1, -1};
320 DragScrollMode drag_scroll{DragScrollMode::None};
321 bool update_scrollbar{
true};
322 bool pass_to_dialog{
false};
323 bool selectable{
false};
324 int scroll_repeat{100};
328 std::size_t max_line_width{0};
340 template <
typename typeT>
341 inline auto FTextView::operator << (
const typeT& s) ->
FTextView&
346 if ( ! outstream.str().isEmpty() )
347 append (outstream.str());
353 inline auto FTextView::operator << (
const UniChar& c) ->
FTextView&
355 append (static_cast<wchar_t>(c));
360 inline auto FTextView::operator << (
const std::string&
string) ->
FTextView&
367 inline auto FTextView::getClassName()
const ->
FString 368 {
return "FTextView"; }
371 inline auto FTextView::getColumns()
const noexcept -> std::size_t
372 {
return max_line_width; }
375 inline auto FTextView::getRows()
const -> std::size_t
376 {
return data.size(); }
379 inline auto FTextView::getScrollPos()
const ->
FPoint 380 {
return {xoffset, yoffset}; }
383 inline auto FTextView::getTextVisibleSize()
const ->
FSize 384 {
return {
FSize{getTextWidth(), getTextHeight()} }; }
387 inline auto FTextView::getSelectionStart()
const ->
FTextPosition 388 {
return selection_start; }
391 inline auto FTextView::getSelectionEnd()
const ->
FTextPosition 392 {
return selection_end; }
395 inline auto FTextView::getLine (FTextViewList::size_type line) ->
FTextViewLine&
396 {
return data.at(line); }
399 inline auto FTextView::getLine (FTextViewList::size_type line)
const ->
const FTextViewLine&
400 {
return data.at(line); }
403 inline auto FTextView::getLines()
const & ->
const FTextViewList&
407 inline void FTextView::setSelectionStart (
const FTextViewList::size_type row
408 ,
const FString::size_type col )
409 { selection_start = {row, col}; }
412 inline void FTextView::setSelectionEnd (
const FTextViewList::size_type row
413 ,
const FString::size_type col )
414 { selection_end = {row, col}; }
417 inline void FTextView::resetSelection()
419 selection_start = {UNINITIALIZED_ROW, UNINITIALIZED_COLUMN};
420 selection_end = {UNINITIALIZED_ROW, UNINITIALIZED_COLUMN};
424 template <
typename T>
425 inline void FTextView::setLines (T&& list)
428 data = std::forward<T>(list);
429 updateVerticalScrollBar();
434 inline void FTextView::setSelectable (
bool enable)
435 { selectable = enable; }
438 inline void FTextView::unsetSelectable()
439 { selectable =
false; }
442 inline void FTextView::scrollTo (
const FPoint& pos)
443 { scrollTo(pos.getX(), pos.getY()); }
446 inline auto FTextView::hasSelectedText()
const ->
bool 448 return selection_start.row != UNINITIALIZED_ROW
449 && selection_end.row != UNINITIALIZED_ROW
450 && selection_start.column != UNINITIALIZED_COLUMN
451 && selection_end.column != UNINITIALIZED_COLUMN;
455 inline auto FTextView::isSelectable()
const ->
bool 456 {
return selectable; }
459 template <
typename T>
460 void FTextView::append (
const std::initializer_list<T>& list)
462 for (
const auto& str : list)
467 template <
typename T>
468 void FTextView::insert (
const std::initializer_list<T>& list,
int pos)
470 for (
const auto& str : list)
478 inline void FTextView::deleteLine (
int pos)
479 { deleteRange (pos, pos); }
482 inline auto FTextView::isHorizontallyScrollable()
const ->
bool 483 {
return max_line_width > getTextWidth(); }
486 inline auto FTextView::isVerticallyScrollable()
const ->
bool 487 {
return getRows() > getTextHeight(); }
490 template<
typename T1,
typename T2>
491 inline void FTextView::setSelectionStartInt (T1&& row, T2&& col)
493 selection_start = {
static_cast<const FTextViewList::size_type
>(std::forward<T1>(row))
494 ,
static_cast<const FString::size_type
>(std::forward<T2>(col)) };
498 template<
typename T1,
typename T2>
499 inline void FTextView::setSelectionEndInt (T1&& row, T2&& col)
501 selection_end = {
static_cast<const FTextViewList::size_type
>(std::forward<T1>(row))
502 ,
static_cast<const FString::size_type
>(std::forward<T2>(col)) };
507 #endif // FTEXTVIEW_H Definition: ftextview.h:80
Definition: fvtermbuffer.h:56
Definition: class_template.cpp:25
Definition: ftextview.h:159
Definition: ftextview.h:83
Definition: fstringstream.h:56
Definition: fcolorpair.h:49
Definition: ftextview.h:144