mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:52:45 +00:00 
			
		
		
		
	TextEditor: Show the current cursor position in the statusbar.
This commit is contained in:
		
							parent
							
								
									9158de6c41
								
							
						
					
					
						commit
						ca65ca2f2d
					
				
					 3 changed files with 31 additions and 20 deletions
				
			
		|  | @ -25,6 +25,10 @@ int main(int argc, char** argv) | ||||||
|     auto* text_editor = new GTextEditor(widget); |     auto* text_editor = new GTextEditor(widget); | ||||||
|     auto* statusbar = new GStatusBar(widget); |     auto* statusbar = new GStatusBar(widget); | ||||||
| 
 | 
 | ||||||
|  |     text_editor->on_cursor_change = [statusbar] (GTextEditor& editor) { | ||||||
|  |         statusbar->set_text(String::format("Line: %d, Column: %d", editor.cursor().line(), editor.cursor().column())); | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     { |     { | ||||||
|         StringBuilder builder; |         StringBuilder builder; | ||||||
|         int fd = open("/home/anon/ReadMe.md", O_RDONLY); |         int fd = open("/home/anon/ReadMe.md", O_RDONLY); | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ | ||||||
| GTextEditor::GTextEditor(GWidget* parent) | GTextEditor::GTextEditor(GWidget* parent) | ||||||
|     : GWidget(parent) |     : GWidget(parent) | ||||||
| { | { | ||||||
|     set_font(GFontDatabase::the().get_by_name("Liza Thin")); |     set_font(GFontDatabase::the().get_by_name("Csilla Thin")); | ||||||
| 
 | 
 | ||||||
|     set_fill_with_background_color(false); |     set_fill_with_background_color(false); | ||||||
| 
 | 
 | ||||||
|  | @ -48,7 +48,7 @@ void GTextEditor::set_text(const String& text) | ||||||
|             add_line(i); |             add_line(i); | ||||||
|     } |     } | ||||||
|     add_line(i); |     add_line(i); | ||||||
|     m_cursor = GTextPosition(0, 0); |     set_cursor(0, 0); | ||||||
|     update(); |     update(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -116,35 +116,31 @@ void GTextEditor::keydown_event(GKeyEvent& event) | ||||||
| { | { | ||||||
|     if (event.key() == KeyCode::Key_Up) { |     if (event.key() == KeyCode::Key_Up) { | ||||||
|         if (m_cursor.line() > 0) { |         if (m_cursor.line() > 0) { | ||||||
|             update_cursor(); |             int new_line = m_cursor.line() - 1; | ||||||
|             m_cursor.set_line(m_cursor.line() - 1); |             int new_column = min(m_cursor.column(), m_lines[new_line].length()); | ||||||
|             m_cursor.set_column(min(m_cursor.column(), m_lines[m_cursor.line()].length())); |             set_cursor(new_line, new_column); | ||||||
|             update_cursor(); |  | ||||||
|         } |         } | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     if (event.key() == KeyCode::Key_Down) { |     if (event.key() == KeyCode::Key_Down) { | ||||||
|         if (m_cursor.line() < (m_lines.size() - 1)) { |         if (m_cursor.line() < (m_lines.size() - 1)) { | ||||||
|             update_cursor(); |             int new_line = m_cursor.line() + 1; | ||||||
|             m_cursor.set_line(m_cursor.line() + 1); |             int new_column = min(m_cursor.column(), m_lines[new_line].length()); | ||||||
|             m_cursor.set_column(min(m_cursor.column(), m_lines[m_cursor.line()].length())); |             set_cursor(new_line, new_column); | ||||||
|             update_cursor(); |  | ||||||
|         } |         } | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     if (event.key() == KeyCode::Key_Left) { |     if (event.key() == KeyCode::Key_Left) { | ||||||
|         if (m_cursor.column() > 0) { |         if (m_cursor.column() > 0) { | ||||||
|             update_cursor(); |             int new_column = m_cursor.column() - 1; | ||||||
|             m_cursor.set_column(m_cursor.column() - 1); |             set_cursor(m_cursor.line(), new_column); | ||||||
|             update_cursor(); |  | ||||||
|         } |         } | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     if (event.key() == KeyCode::Key_Right) { |     if (event.key() == KeyCode::Key_Right) { | ||||||
|         if (m_cursor.column() < (m_lines[m_cursor.line()].length())) { |         if (m_cursor.column() < (m_lines[m_cursor.line()].length())) { | ||||||
|             update_cursor(); |             int new_column = m_cursor.column() + 1; | ||||||
|             m_cursor.set_column(m_cursor.column() + 1); |             set_cursor(m_cursor.line(), new_column); | ||||||
|             update_cursor(); |  | ||||||
|         } |         } | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  | @ -210,6 +206,17 @@ void GTextEditor::update_cursor() | ||||||
|     update(); |     update(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void GTextEditor::set_cursor(int line, int column) | ||||||
|  | { | ||||||
|  |     if (m_cursor.line() == line && m_cursor.column() == column) | ||||||
|  |         return; | ||||||
|  |     update_cursor(); | ||||||
|  |     m_cursor = GTextPosition(line, column); | ||||||
|  |     update_cursor(); | ||||||
|  |     if (on_cursor_change) | ||||||
|  |         on_cursor_change(*this); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void GTextEditor::Line::set_text(const String& text) | void GTextEditor::Line::set_text(const String& text) | ||||||
| { | { | ||||||
|     if (text == m_text) |     if (text == m_text) | ||||||
|  |  | ||||||
|  | @ -33,16 +33,15 @@ public: | ||||||
|     explicit GTextEditor(GWidget* parent); |     explicit GTextEditor(GWidget* parent); | ||||||
|     virtual ~GTextEditor() override; |     virtual ~GTextEditor() override; | ||||||
| 
 | 
 | ||||||
|  |     Function<void(GTextEditor&)> on_cursor_change; | ||||||
|  | 
 | ||||||
|     void set_text(const String&); |     void set_text(const String&); | ||||||
| 
 |  | ||||||
|     int content_width() const; |     int content_width() const; | ||||||
| 
 |  | ||||||
|     Rect visible_content_rect() const; |     Rect visible_content_rect() const; | ||||||
|     void scroll_into_view(const GTextPosition&, Orientation); |     void scroll_into_view(const GTextPosition&, Orientation); | ||||||
| 
 |  | ||||||
|     int line_count() const { return m_lines.size(); } |     int line_count() const { return m_lines.size(); } | ||||||
| 
 |  | ||||||
|     int padding() const { return 2; } |     int padding() const { return 2; } | ||||||
|  |     GTextPosition cursor() const { return m_cursor; } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     virtual void paint_event(GPaintEvent&) override; |     virtual void paint_event(GPaintEvent&) override; | ||||||
|  | @ -55,6 +54,7 @@ private: | ||||||
|     Rect line_content_rect(int item_index) const; |     Rect line_content_rect(int item_index) const; | ||||||
|     Rect cursor_content_rect() const; |     Rect cursor_content_rect() const; | ||||||
|     void update_cursor(); |     void update_cursor(); | ||||||
|  |     void set_cursor(int line, int column); | ||||||
| 
 | 
 | ||||||
|     GScrollBar* m_vertical_scrollbar { nullptr }; |     GScrollBar* m_vertical_scrollbar { nullptr }; | ||||||
|     GScrollBar* m_horizontal_scrollbar { nullptr }; |     GScrollBar* m_horizontal_scrollbar { nullptr }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling