~aleteoryx/muditaos

ref: 7fbaf735ed99f5b0d26adb686cfa6ed2bb4267d5 muditaos/module-gui/gui/widgets/TextDocument.hpp -rw-r--r-- 1.8 KiB
7fbaf735 — Przemyslaw Brudny [EGD-7813] Option Window titles localizations fix 4 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include <list>
#include <utility>
#include "TextBlock.hpp"
#include "TextBlockCursor.hpp"

namespace gui
{
    class TextLine;

    class TextDocument
    {
        friend BlockCursor;

        static const std::string newline;
        std::list<TextBlock> blocks;

      public:
        TextDocument(const std::list<TextBlock> &blocks);
        ~TextDocument();
        void destroy();

        void append(std::list<TextBlock> &&blocks);
        void append(TextBlock &&text);
        void addNewline(BlockCursor &cursor, TextBlock::End eol);
        [[nodiscard]] auto getText() const -> UTF8;

        /// --- in progress
        BlockCursor getBlockCursor(unsigned int position);
        /// get part of TextBlock based on cursor
        std::string getText(BlockCursor cursor);

        /// needed for tests, alternatively could be mocked in test...
        [[nodiscard]] const std::list<TextBlock> &getBlocks() const;
        [[nodiscard]] const TextBlock *getBlock(BlockCursor *cursor) const;

        /// note just for creating line for easy current block under cursor access
        /// remove - use getTextPart instead?
        /// or remove getTextPart and always use cursor...
        const TextBlock &operator()(const BlockCursor &cursor) const;
        void removeBlock(unsigned int block_nr);
        void removeBlock(std::list<TextBlock>::iterator it);
        // TODO this is very unoptimal...
        bool isEmpty() const
        {
            return getText().length() == 0;
        }

      private:
        /// splits text block in document and returns two new blocks (in place of last one)
        auto split(BlockCursor &cursor) -> std::pair<TextBlock &, TextBlock &>;
    };
}; // namespace gui