@@ -57,8 +57,6 @@ def __init__(self, **kwargs):
5757 self .toolbar_view .append (headerbar )
5858 self .set_title ("ASCII Draw" )
5959
60- # self.set_default_size(800, 800)
61-
6260 self .settings .bind ("window-width" , self , "default-width" , Gio .SettingsBindFlags .DEFAULT )
6361 self .settings .bind ("window-height" , self , "default-height" , Gio .SettingsBindFlags .DEFAULT )
6462
@@ -159,6 +157,12 @@ def __init__(self, **kwargs):
159157 self .table_button .set_group (self .rectangle_button )
160158 action_bar .pack_start (self .table_button )
161159
160+ self .tree_button = Gtk .ToggleButton (icon_name = "tree-list-symbolic" ,
161+ tooltip_text = "Tree View Ctrl+U" )
162+ self .tree_button .connect ("toggled" , self .on_choose_tree_list )
163+ self .tree_button .set_group (self .rectangle_button )
164+ action_bar .pack_start (self .tree_button )
165+
162166 self .eraser_button = Gtk .ToggleButton (icon_name = "eraser-symbolic" ,
163167 tooltip_text = "Eraser Ctrl+E" )
164168 self .eraser_button .connect ("toggled" , self .on_choose_eraser )
@@ -179,9 +183,6 @@ def __init__(self, **kwargs):
179183 save_button .connect ("clicked" , self .save )
180184 copy_button = Gtk .Button (icon_name = "edit-copy-symbolic" )
181185 copy_button .connect ("clicked" , self .copy_content )
182- # export_box = Gtk.Box()
183- # export_box.append(save_button)
184- # export_box.append(copy_button)
185186
186187 headerbar .pack_start (save_button )
187188 headerbar .pack_start (copy_button )
@@ -293,6 +294,7 @@ def __init__(self, **kwargs):
293294 self .text_entry = Gtk .TextView (vexpand = True , css_classes = ["mono-entry" , "card" ],
294295 left_margin = 12 , top_margin = 12 , wrap_mode = 2 , height_request = 100 )
295296 self .text_entry_buffer = self .text_entry .get_buffer ()
297+ self .text_entry_buffer .connect ("changed" , self .insert_text_preview )
296298
297299 self .toolbar_view .append (self .overlay_split_view )
298300 self .toolbar_view .append (action_bar )
@@ -341,8 +343,6 @@ def __init__(self, **kwargs):
341343 self .text_x = 0
342344 self .text_y = 0
343345
344- self .text_entry .get_buffer ().connect ("changed" , self .insert_text_preview )
345-
346346 unicode_ranges = [
347347 range (0x0021 , 0x007F ), # Basic Latin
348348 range (0x00A0 , 0x0100 ), # Latin-1 Supplement
@@ -412,16 +412,13 @@ def __init__(self, **kwargs):
412412 self .font_box = Gtk .ListBox (css_classes = ["navigation-sidebar" ], vexpand = True )
413413 self .selected_font = "Normal"
414414 self .font_box .connect ("row-selected" , self .font_row_selected )
415- # homogeneous_box = Gtk.Grid(row_homogeneous=True, width_request=429)
416415 scrolled_window = Gtk .ScrolledWindow (vexpand = True , margin_bottom = 12 )
417416 scrolled_window .set_policy (2 ,1 )
418417 scrolled_window .set_child (self .text_entry )
419418 self .text_sidebar .append (scrolled_window )
420- # homogeneous_box.attach(scrolled_window, 0, 0, 1, 1)
421419 scrolled_window = Gtk .ScrolledWindow (margin_bottom = 12 , css_classes = ["card" ])
422420 scrolled_window .set_policy (2 ,1 )
423421 scrolled_window .set_child (self .font_box )
424- # homogeneous_box.attach(scrolled_window, 0, 1, 2, 2)
425422
426423 self .text_sidebar .append (scrolled_window )
427424
@@ -453,7 +450,6 @@ def __init__(self, **kwargs):
453450 columns_spin .get_adjustment ().set_step_increment (1 )
454451 columns_row .add_suffix (columns_spin )
455452 self .table_sidebar .append (columns_row )
456- # self.table_sidebar.append(Gtk.Separator())
457453
458454 rows_row = Adw .ActionRow (title = "Rows" , css_classes = ["card" ], margin_bottom = 12 ) #Adw.SpinRow(title="Width")
459455 buttons_box = Gtk .Box (spacing = 10 )
@@ -489,6 +485,25 @@ def __init__(self, **kwargs):
489485 self .rows_number = 0
490486 self .columns_number = 0
491487
488+ self .tree_sidebar = Gtk .Box (orientation = 1 , margin_start = 12 , margin_end = 12 , margin_bottom = 12 , margin_top = 12 )
489+
490+ self .tree_text_entry = Gtk .TextView (vexpand = True , css_classes = ["mono-entry" , "card" ],
491+ left_margin = 12 , top_margin = 12 , wrap_mode = 2 , height_request = 100 , accepts_tab = False )
492+ self .tree_text_entry_buffer = self .tree_text_entry .get_buffer ()
493+ self .tree_text_entry_buffer .connect ("insert-text" , self .on_tree_text_inserted )
494+ self .tree_text_entry_buffer .connect ("changed" , self .preview_tree )
495+
496+ scrolled_window = Gtk .ScrolledWindow (vexpand = True , margin_bottom = 12 , width_request = 405 )
497+ scrolled_window .set_policy (2 ,1 )
498+ scrolled_window .set_child (self .tree_text_entry )
499+ self .tree_sidebar .append (scrolled_window )
500+ write_button = Gtk .Button (label = "Enter" )
501+ write_button .connect ("clicked" , self .insert_tree_definitely )
502+ self .tree_sidebar .append (write_button )
503+
504+ self .tree_x = 0
505+ self .tree_y = 0
506+
492507 def preview_table (self , entry = None , arg = None ):
493508 self .clear (None , self .preview_grid )
494509 table_type = self .table_types_drop_down .get_selected ()
@@ -505,7 +520,7 @@ def insert_text_definitely(self, btn):
505520 self .clear (None , self .preview_grid )
506521 self .insert_text (self .grid , self .text_x , self .text_y , text )
507522
508- def insert_text_preview (self , btn ):
523+ def insert_text_preview (self , widget ):
509524 start = self .text_entry_buffer .get_start_iter ()
510525 end = self .text_entry_buffer .get_end_iter ()
511526 text = self .text_entry_buffer .get_text (start , end , False )
@@ -668,6 +683,8 @@ def change_style(self, btn, box):
668683 self .style = index
669684 if self .tool == "TABLE" :
670685 self .preview_table ()
686+ elif self .tool == "TREE" :
687+ self .preview_tree ()
671688 return
672689 child = child .get_next_sibling ()
673690 index += 1
@@ -714,6 +731,11 @@ def on_click_released(self, click, arg, x, y):
714731 table_type = self .table_types_drop_down .get_selected ()
715732 self .insert_table (table_type , self .preview_grid )
716733
734+ elif self .tool == "TREE" :
735+ self .tree_x = x_char
736+ self .tree_y = y_char
737+ self .preview_tree ()
738+
717739 elif self .tool == "PICKER" :
718740 child = self .grid .get_child_at (x_char , y_char )
719741 if child :
@@ -747,7 +769,7 @@ def on_choose_picker(self, btn):
747769 self .overlay_split_view .set_reveal_flap (True )
748770
749771 self .remove_all_pages ()
750- label = Gtk .Label (label = "Tool settings " )
772+ label = Gtk .Label (label = "Picker " )
751773 self .sidebar_notebook .append_page (self .picker_sidebar , label )
752774
753775 def on_choose_rectangle (self , btn ):
@@ -793,6 +815,7 @@ def on_choose_text(self, btn):
793815 if btn .get_active ():
794816 self .tool = "TEXT"
795817
818+ self .show_sidebar_button .set_sensitive (True )
796819 self .overlay_split_view .set_reveal_flap (True )
797820
798821 self .remove_all_pages ()
@@ -803,6 +826,7 @@ def on_choose_table(self, btn):
803826 if btn .get_active ():
804827 self .tool = "TABLE"
805828
829+ self .show_sidebar_button .set_sensitive (True )
806830 self .overlay_split_view .set_reveal_flap (True )
807831
808832 self .remove_all_pages ()
@@ -811,6 +835,19 @@ def on_choose_table(self, btn):
811835 label = Gtk .Label (label = "Styles" )
812836 self .sidebar_notebook .append_page (self .lines_styles_selection , label )
813837
838+ def on_choose_tree_list (self , btn ):
839+ if btn .get_active ():
840+ self .tool = "TREE"
841+
842+ self .show_sidebar_button .set_sensitive (True )
843+ self .overlay_split_view .set_reveal_flap (True )
844+
845+ self .remove_all_pages ()
846+ label = Gtk .Label (label = "Tree View" )
847+ self .sidebar_notebook .append_page (self .tree_sidebar , label )
848+ label = Gtk .Label (label = "Styles" )
849+ self .sidebar_notebook .append_page (self .lines_styles_selection , label )
850+
814851 def on_choose_free (self , btn ):
815852 self .reset_text_entry ()
816853 if btn .get_active ():
@@ -823,7 +860,7 @@ def on_choose_free(self, btn):
823860 self .remove_all_pages ()
824861 label = Gtk .Label (label = "Chars" )
825862 self .sidebar_notebook .append_page (self .free_char_list , label )
826- label = Gtk .Label (label = "Tool settings " )
863+ label = Gtk .Label (label = "Freehand Brush " )
827864 self .sidebar_notebook .append_page (self .freehand_sidebar , label )
828865
829866 def on_choose_eraser (self , btn ):
@@ -836,7 +873,7 @@ def on_choose_eraser(self, btn):
836873 self .overlay_split_view .set_reveal_flap (True )
837874
838875 self .remove_all_pages ()
839- label = Gtk .Label (label = "Tool settings " )
876+ label = Gtk .Label (label = "Eraser " )
840877 self .sidebar_notebook .append_page (self .eraser_sidebar , label )
841878
842879 def reset_text_entry (self ):
@@ -1009,7 +1046,7 @@ def on_drag_follow(self, gesture, end_x, end_y):
10091046 self .drawing_area .queue_draw ()
10101047
10111048 def on_drag_end (self , gesture , delta_x , delta_y ):
1012- if self .tool != "TEXT" and self .tool != "TABLE" :
1049+ if self .tool != "TEXT" and self .tool != "TABLE" and self . tool != "TREE" :
10131050 self .force_clear (self .preview_grid )
10141051 if self .flip :
10151052 delta_x = - delta_x
@@ -1237,6 +1274,103 @@ def draw_rectangle(self, start_x_char, start_y_char, width, height, grid):
12371274 self .set_char_at (start_x_char , start_y_char , grid , self .top_left ())
12381275 self .set_char_at (start_x_char , start_y_char + height - 1 , grid , self .bottom_left ())
12391276
1277+ def on_tree_text_inserted (self , buffer , loc , text , lenght ):
1278+ spaces = 0
1279+ if text == "\n " :
1280+ start_iter = loc .copy ()
1281+ start_iter .set_line_offset (0 )
1282+ end_iter = start_iter .copy ()
1283+ start_iter .backward_char ()
1284+ while not end_iter .ends_line ():
1285+ start_iter .forward_char ()
1286+ end_iter .forward_char ()
1287+ char = buffer .get_text (start_iter , end_iter , False )
1288+ if char != " " :
1289+ break
1290+ spaces += 1
1291+ indentation = " " * spaces
1292+ buffer .insert (loc , f"{ indentation } " )
1293+ loc .backward_chars (spaces )
1294+ end_iter = buffer .get_end_iter ()
1295+
1296+ self .preview_tree ()
1297+
1298+ def preview_tree (self , widget = None ):
1299+ self .clear (None , self .preview_grid )
1300+ start = self .tree_text_entry_buffer .get_start_iter ()
1301+ end = self .tree_text_entry_buffer .get_end_iter ()
1302+ input_text = self .tree_text_entry_buffer .get_text (start , end , False )
1303+ self .insert_tree (self .preview_grid , self .tree_x , self .tree_y , input_text )
1304+
1305+ def insert_tree_definitely (self , widget = None ):
1306+ self .clear (None , self .preview_grid )
1307+ self .add_undo_action ("Treeview" )
1308+ start = self .tree_text_entry_buffer .get_start_iter ()
1309+ end = self .tree_text_entry_buffer .get_end_iter ()
1310+ input_text = self .tree_text_entry_buffer .get_text (start , end , False )
1311+ self .insert_tree (self .grid , self .tree_x , self .tree_y , input_text )
1312+
1313+ def insert_tree (self , grid , start_x , start_y , input_text ):
1314+ lines = input_text .split ("\n " )
1315+ processed_lines = []
1316+ current_indent = 0
1317+ leading_spaces = []
1318+ indent_level = 0
1319+ print ("------tree------" )
1320+ for index , line in enumerate (lines ):
1321+ print ("------line------" )
1322+ stripped_line = line .lstrip (' ' ) # Remove leading underscores
1323+ indent_space = len (line ) - len (stripped_line )
1324+ line_number = len (leading_spaces )
1325+ if line_number > 0 :
1326+ if indent_space > leading_spaces [- 1 ]:
1327+ indent_level = current_indent + 1
1328+ elif indent_space == leading_spaces [- 1 ]:
1329+ indent_level = current_indent
1330+ else :
1331+ previos_spaces = 0
1332+ indent_level = current_indent - 1
1333+ for i in range (line_number - 1 , 0 , - 1 ):
1334+ print (indent_level , indent_space , leading_spaces [i ])
1335+ if i != 0 :
1336+ leading_spaces [i ] #previous spaces
1337+ indent_space # current spaces
1338+ if leading_spaces [i ] < indent_space :
1339+ break
1340+ if leading_spaces [i ] < previos_spaces :
1341+ indent_level -= 1
1342+ previos_spaces = leading_spaces [i ]
1343+ elif leading_spaces [i ] > previos_spaces :
1344+ print (f"the indent is { processed_lines [i - line_number ][0 ]} was { indent_level } " )
1345+ indent_level = processed_lines [i - line_number ][0 ]
1346+ previos_spaces = leading_spaces [i ]
1347+ current_indent = indent_level
1348+ leading_spaces .append (indent_space )
1349+ processed_lines .append ([indent_level , stripped_line ])
1350+
1351+ tree_structure = ""
1352+
1353+ y = self .tree_y
1354+ for index , (indent , text ) in enumerate (processed_lines ):
1355+ x = self .tree_x + (indent ) * 4
1356+ self .insert_text (grid , x , y , text )
1357+ if indent != 0 :
1358+ self .set_char_at (x - 1 , y , grid , " " )
1359+ self .set_char_at (x - 2 , y , grid , self .bottom_horizontal ())
1360+ self .set_char_at (x - 3 , y , grid , self .bottom_horizontal ())
1361+ self .set_char_at (x - 4 , y , grid , self .bottom_left ())
1362+
1363+ prev_index = index - 1
1364+ while processed_lines [prev_index ][0 ] != processed_lines [index ][0 ] - 1 :
1365+ if prev_index < 0 :
1366+ break
1367+ if processed_lines [prev_index ][0 ] == processed_lines [index ][0 ]:
1368+ self .set_char_at (x - 4 , y - (index - prev_index ), grid , self .right_intersect ())
1369+ else :
1370+ self .set_char_at (x - 4 , y - (index - prev_index ), grid , self .left_vertical ())
1371+ prev_index -= 1
1372+ y += 1
1373+
12401374 def insert_table (self , table_type , grid ):
12411375 child = self .rows_box .get_first_child ()
12421376 columns_widths = []
@@ -1560,6 +1694,10 @@ def select_table_tool(self):
15601694 self .table_button .set_active (True )
15611695 self .tool = "TABLE"
15621696
1697+ def select_tree_tool (self ):
1698+ self .tree_button .set_active (True )
1699+ self .tool = "TREE"
1700+
15631701 def select_free_tool (self ):
15641702 self .free_button .set_active (True )
15651703 self .tool = "FREE"
0 commit comments