Skip to content

Commit 8686155

Browse files
committed
added tree view tool
1 parent beafef5 commit 8686155

File tree

1 file changed

+154
-16
lines changed

1 file changed

+154
-16
lines changed

src/window.py

Lines changed: 154 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)