Skip to content

Commit

Permalink
area for recently used symbols in sidebar
Browse files Browse the repository at this point in the history
  • Loading branch information
cvfosammmm committed Feb 15, 2022
1 parent 0be1b68 commit 912cd03
Show file tree
Hide file tree
Showing 4 changed files with 134 additions and 27 deletions.
2 changes: 1 addition & 1 deletion data/resources/style_gtk.css
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ overlay.sidebar flowbox flowboxchild image {
padding: 5px;
}
overlay.sidebar flowbox flowboxchild image.no_right_border {
border-right-width: 0px;
border-right: 1px solid mix(@theme_base_color, @theme_bg_color, 0.7);
}

/*
Expand Down
6 changes: 4 additions & 2 deletions setzer/app/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,9 @@ def set_defaults(self):

self.defaults['app_include_bibtex_file_dialog'] = dict()
self.defaults['app_include_bibtex_file_dialog']['presets'] = None


self.defaults['app_recent_symbols'] = {'symbols': []}

self.defaults['preferences'] = dict()
self.defaults['preferences']['cleanup_build_files'] = True
self.defaults['preferences']['autoshow_build_log'] = 'errors_warnings'
Expand Down Expand Up @@ -133,7 +135,7 @@ def unpickle(self):
else:
try: self.data = pickle.load(filehandle)
except EOFError: False

return True

def pickle(self):
Expand Down
133 changes: 111 additions & 22 deletions setzer/workspace/sidebar/sidebar.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@

import math
import time
import xml.etree.ElementTree as ET
import os


class Sidebar(object):
Expand All @@ -53,16 +55,21 @@ def __init__(self, workspace):
'sidebar_view.SidebarPageSymbolsList("misc_math", 42)'])
self.pages.append(['misc_text', 'own-symbols-misc-text-symbolic', _('Misc. Symbols'),
'sidebar_view.SidebarPageSymbolsList("misc_text", 38)'])
self.init_page_stack()
self.init_pages()

self.recent = ServiceLocator.get_settings().get_value('app_recent_symbols', 'symbols')
self.recent_details = list()
self.recent_page_size = None
self.update_recent_widget()

self.view.show_all()

self.view.connect('size-allocate', self.on_scroll_or_resize)
self.view.vbox.connect('size-allocate', self.on_scroll_or_resize)
self.view.scrolled_window.get_vadjustment().connect('value-changed', self.on_scroll_or_resize)
self.view.next_button.connect('clicked', self.on_next_button_clicked)
self.view.prev_button.connect('clicked', self.on_prev_button_clicked)

def init_page_stack(self):
def init_pages(self):
for page in reversed(self.pages):
page_view = eval(page[3])
label = Gtk.Label(page[2])
Expand All @@ -72,19 +79,78 @@ def init_page_stack(self):
label.set_size_request(108, -1)
label.get_style_context().add_class('overlay')
self.view.add_overlay(label)
self.view.reorder_overlay(label, 0)
self.view.reorder_overlay(label, 1)
self.view.set_overlay_pass_through(label, True)
self.view.labels.append(label)
self.view.page_views.append(page_view)
self.view.vbox.pack_end(page_view, False, False, 0)
placeholder = Gtk.Label(page[2])
placeholder.set_xalign(0)
if page != self.pages[0]:
self.view.vbox.pack_end(placeholder, False, False, 0)
page_view.connect('size-allocate', self.on_stack_size_allocate)
self.view.vbox.pack_end(placeholder, False, False, 0)
page_view.connect('size-allocate', self.on_page_size_allocate)
page_view.connect('button-press-event', self.on_flowbox_clicked, page_view.symbols)
self.init_symbols_page(page_view)

def update_recent_widget(self):
for item in [item for item in self.recent]:
self.add_recent_symbol_to_flowbox(item)
self.view.page_view_recent.connect('button-press-event', self.on_recent_widget_clicked)
self.view.page_view_recent.connect('size-allocate', self.on_recent_page_size_allocate)

def on_recent_widget_clicked(self, flowbox, event):
if event.button != 1: return

child = flowbox.get_child_at_pos(event.x, event.y)

if child != None and self.workspace.active_document != None:
self.workspace.get_active_document().content.insert_text_at_cursor(self.recent_details[- child.get_index() - 1][1])
self.workspace.get_active_document().content.scroll_cursor_onscreen()
self.add_recent_symbol(self.recent[- child.get_index() - 1])

return True

def remove_recent_symbol(self, item):
self.recent.remove(item)
for symbol in [symbol for symbol in self.recent_details]:
if item[1] == symbol[1]:
self.view.page_view_recent.remove(symbol[5])
self.recent_details.remove(symbol)

def add_recent_symbol(self, new_item):
for item in [item for item in self.recent]:
if item[1] == new_item[1]:
self.remove_recent_symbol(item)
if len(self.recent) >= 20:
self.remove_recent_symbol(self.recent[0])

self.recent.append(new_item)
self.add_recent_symbol_to_flowbox(new_item)

def add_recent_symbol_to_flowbox(self, item):
(category, command) = item
xml_tree = ET.parse(os.path.join(ServiceLocator.get_resources_path(), 'symbols', category + '.xml'))
xml_root = xml_tree.getroot()
elements = xml_root.findall('./symbol[@command=\'' + command + '\']')
if len(elements) == 0:
self.remove_recent_symbol(item)
else:
attrib = elements[0].attrib
symbol = [attrib['file'].rsplit('.')[0], attrib['command'], attrib.get('package', None), int(attrib.get('original_width', 10)), int(attrib.get('original_height', 10))]
size = max(symbol[3], symbol[4])

image = Gtk.Image.new_from_icon_name('sidebar-' + symbol[0] + '-symbolic', 0)
image.set_pixel_size(int(size * 1.5))
tooltip_text = symbol[1]
if symbol[2] != None:
tooltip_text += ' (' + _('Package') + ': ' + symbol[2] + ')'
image.set_tooltip_text(tooltip_text)
image.show_all()
symbol.append(image)
self.recent_details.append(symbol)

self.view.page_view_recent.insert(image, 0)
self.view.queue_draw()

def init_symbols_page(self, page_view):
for symbol in page_view.symbols:
image = symbol[5]
Expand All @@ -104,7 +170,7 @@ def on_scroll_or_resize(self, *args):
self.update_labels()

def update_labels(self):
offset = 0
offset = self.view.page_view_recent.get_allocated_height() + self.view.label_recent.get_allocated_height() + 1
scrolling_offset = self.view.scrolled_window.get_vadjustment().get_value()
self.view.tabs_box.get_style_context().remove_class('no-border')
for key, page in enumerate(reversed(self.view.page_views)):
Expand All @@ -116,8 +182,12 @@ def update_labels(self):
offset += page.get_allocated_height() + label.get_allocated_height() + 1

def on_next_button_clicked(self, button):
offset = 0
offset = self.view.page_view_recent.get_allocated_height() + self.view.label_recent.get_allocated_height() + 1
scrolling_offset = self.view.scrolled_window.get_vadjustment().get_value()
if scrolling_offset < offset:
self.scroll_view(offset)
return

for key, page in enumerate(reversed(self.view.page_views)):
label = self.view.labels[len(self.view.page_views) - key - 1]
if offset >= scrolling_offset - (page.get_allocated_height() + label.get_allocated_height()):
Expand All @@ -128,9 +198,14 @@ def on_next_button_clicked(self, button):
offset += page.get_allocated_height() + label.get_allocated_height() + 1

def on_prev_button_clicked(self, button):
offset = 0
old_offset = 0
offset = self.view.page_view_recent.get_allocated_height() + self.view.label_recent.get_allocated_height() + 1
old_offset = offset
scrolling_offset = self.view.scrolled_window.get_vadjustment().get_value()

if scrolling_offset <= offset:
self.scroll_view(0)
return

for key, page in enumerate(reversed(self.view.page_views)):
label = self.view.labels[len(self.view.page_views) - key - 1]
if offset >= scrolling_offset - (page.get_allocated_height() + label.get_allocated_height()):
Expand All @@ -151,26 +226,40 @@ def on_flowbox_clicked(self, flowbox, event, symbols_list):
if child != None and self.workspace.active_document != None:
self.workspace.get_active_document().content.insert_text_at_cursor(symbols_list[child.get_index()][1])
self.workspace.get_active_document().content.scroll_cursor_onscreen()
self.add_recent_symbol((flowbox.symbol_folder, symbols_list[child.get_index()][1]))

return True

'''
*** manage borders of images
'''

def on_stack_size_allocate(self, symbol_page, allocation, data=None):
def on_page_size_allocate(self, symbol_page, allocation, data=None):
if symbol_page.size != (allocation.width, allocation.height):
symbol_page.size = (allocation.width, allocation.height)
if isinstance(symbol_page, sidebar_view.SidebarPageSymbolsList):
width_with_border = symbol_page.symbol_width + 11
width_avail = allocation.width
symbols_per_line = int((width_avail) / width_with_border)

for number, image in enumerate(symbol_page.symbols):
if (number % symbols_per_line) == (symbols_per_line - 1):
image[5].get_style_context().add_class('no_right_border')
else:
image[5].get_style_context().remove_class('no_right_border')

width_with_border = symbol_page.symbol_width + 11
width_avail = allocation.width
symbols_per_line = int((width_avail) / width_with_border)

for number, image in enumerate(symbol_page.symbols):
if (number % symbols_per_line) == symbols_per_line - 1:
image[5].get_style_context().add_class('no_right_border')
else:
image[5].get_style_context().remove_class('no_right_border')

def on_recent_page_size_allocate(self, page, allocation, data=None):
if self.recent_page_size != (allocation.width, allocation.height):
self.recent_page_size = (allocation.width, allocation.height)

for number, recent_symbol in enumerate(self.recent_details):
image = recent_symbol[5]
image.get_style_context().remove_class('no_right_border')

for offset in range(max(0, allocation.height) // 20 + 1):
widget = page.get_child_at_pos(allocation.width - 1, offset * 20)
if widget != None:
widget.get_child().get_style_context().add_class('no_right_border')

def scroll_view(self, position, duration=0.2):
adjustment = self.view.scrolled_window.get_vadjustment()
Expand Down
20 changes: 18 additions & 2 deletions setzer/workspace/sidebar/sidebar_viewgtk.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,23 @@ def __init__(self):

self.labels = list()
self.page_views = list()


self.label_recent = Gtk.Label(_('Recent'))
self.label_recent.set_xalign(0)
self.label_recent.set_halign(Gtk.Align.START)
self.label_recent.set_valign(Gtk.Align.START)
self.label_recent.set_size_request(108, -1)
self.label_recent.get_style_context().add_class('overlay')
self.add_overlay(self.label_recent)
self.reorder_overlay(self.label_recent, 0)
self.set_overlay_pass_through(self.label_recent, True)

self.page_view_recent = Gtk.FlowBox()
self.page_view_recent.set_homogeneous(False)
self.page_view_recent.set_valign(Gtk.Align.START)
self.page_view_recent.set_max_children_per_line(20)
self.vbox.pack_start(self.page_view_recent, False, False, 0)

def do_get_request_mode(self):
return Gtk.SizeRequestMode.CONSTANT_SIZE

Expand Down Expand Up @@ -104,7 +120,7 @@ def __init__(self, symbol_folder, symbol_width):
self.symbols.append([symbol_tag.attrib['file'].rsplit('.')[0], symbol_tag.attrib['command'], symbol_tag.attrib.get('package', None), int(symbol_tag.attrib.get('original_width', 10)), int(symbol_tag.attrib.get('original_height', 10))])

self.init_symbols_list()

def init_symbols_list(self):
for symbol in self.symbols:
size = max(symbol[3], symbol[4])
Expand Down

0 comments on commit 912cd03

Please sign in to comment.