* feat: make new connections * refact: context groups | feat: area detection and a bunch of small things. hate yourself for this massive commit
		
			
				
	
	
		
			460 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			460 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package ipc
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"sort"
 | 
						|
	app "textualize/core/App"
 | 
						|
	document "textualize/core/Document"
 | 
						|
	session "textualize/core/Session"
 | 
						|
	"textualize/entities"
 | 
						|
	storage "textualize/storage"
 | 
						|
 | 
						|
	"github.com/google/uuid"
 | 
						|
	"github.com/wailsapp/wails/v2/pkg/runtime"
 | 
						|
)
 | 
						|
 | 
						|
type GetDocumentsResponse struct {
 | 
						|
	Documents     []entities.Document                      `json:"documents"`
 | 
						|
	Groups        []entities.Group                         `json:"groups"`
 | 
						|
	ContextGroups []entities.SerializedLinkedProcessedArea `json:"contextGroups"`
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) GetDocumentById(id string) entities.Document {
 | 
						|
	foundDocument := document.GetDocumentCollection().GetDocumentById(id)
 | 
						|
	return entities.Document(*foundDocument)
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) GetDocuments() GetDocumentsResponse {
 | 
						|
	documents := document.GetDocumentCollection().Documents
 | 
						|
	groups := document.GetGroupCollection().Groups
 | 
						|
	contextGroups := c.GetSerializedContextGroups()
 | 
						|
 | 
						|
	response := GetDocumentsResponse{
 | 
						|
		Groups:        make([]entities.Group, 0),
 | 
						|
		Documents:     make([]entities.Document, 0),
 | 
						|
		ContextGroups: contextGroups,
 | 
						|
	}
 | 
						|
 | 
						|
	for _, d := range documents {
 | 
						|
		sortedAreas := d.Areas
 | 
						|
		sort.Slice(sortedAreas, func(i, j int) bool {
 | 
						|
			return sortedAreas[i].Order < sortedAreas[j].Order
 | 
						|
		})
 | 
						|
 | 
						|
		jsonDocument := entities.Document(d)
 | 
						|
		d.Areas = sortedAreas
 | 
						|
		response.Documents = append(response.Documents, jsonDocument)
 | 
						|
	}
 | 
						|
 | 
						|
	if len(groups) > 0 {
 | 
						|
		sortedGroups := groups
 | 
						|
		sort.Slice(sortedGroups, func(i, j int) bool {
 | 
						|
			return sortedGroups[i].Order < sortedGroups[j].Order
 | 
						|
		})
 | 
						|
		response.Groups = sortedGroups
 | 
						|
	}
 | 
						|
 | 
						|
	return response
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestAddDocument(groupId string, documentName string) entities.Document {
 | 
						|
	filePath, err := runtime.OpenFileDialog(app.GetInstance().Context, runtime.OpenDialogOptions{
 | 
						|
		Title: "Select an Image",
 | 
						|
		Filters: []runtime.FileFilter{
 | 
						|
			{
 | 
						|
				DisplayName: "Image Files (*.jpg, *.png)",
 | 
						|
				Pattern:     "*.jpg;*.png",
 | 
						|
			},
 | 
						|
		},
 | 
						|
	})
 | 
						|
 | 
						|
	if err != nil {
 | 
						|
		runtime.LogError(app.GetInstance().Context, err.Error())
 | 
						|
		return entities.Document{}
 | 
						|
	}
 | 
						|
 | 
						|
	newDocument := document.Entity{
 | 
						|
		Id:        uuid.NewString(),
 | 
						|
		Name:      documentName,
 | 
						|
		Path:      filePath,
 | 
						|
		GroupId:   groupId,
 | 
						|
		ProjectId: session.GetInstance().Project.Id,
 | 
						|
	}
 | 
						|
 | 
						|
	document.GetDocumentCollection().AddDocument(newDocument)
 | 
						|
 | 
						|
	return entities.Document(newDocument)
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) deleteDocumentById(documentId string) bool {
 | 
						|
	collection := document.GetDocumentCollection()
 | 
						|
 | 
						|
	documentToDeleteIndex := -1
 | 
						|
	for i, d := range collection.Documents {
 | 
						|
		if d.Id == documentId {
 | 
						|
			documentToDeleteIndex = i
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if documentToDeleteIndex < 0 {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	collection.Documents[documentToDeleteIndex] = collection.Documents[len(collection.Documents)-1]
 | 
						|
	collection.Documents = collection.Documents[:len(collection.Documents)-1]
 | 
						|
	return true
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestUpdateDocumentUserMarkdown(documentId string, markdown string) entities.UserMarkdown {
 | 
						|
	markdownCollection := document.GetUserMarkdownCollection()
 | 
						|
	markdownToUpdate := markdownCollection.GetUserMarkdownByDocumentId(documentId)
 | 
						|
 | 
						|
	newMarkdown := entities.UserMarkdown{
 | 
						|
		DocumentId: documentId,
 | 
						|
		Value:      markdown,
 | 
						|
	}
 | 
						|
	if markdownToUpdate == nil {
 | 
						|
		newMarkdown.Id = uuid.NewString()
 | 
						|
	} else {
 | 
						|
		newMarkdown.Id = markdownToUpdate.Id
 | 
						|
	}
 | 
						|
 | 
						|
	updatedMarkdown := markdownCollection.UpdateUserMarkdown(newMarkdown)
 | 
						|
	return entities.UserMarkdown(updatedMarkdown)
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) deleteDocumentUserMarkdown(documentId string) bool {
 | 
						|
	collection := document.GetUserMarkdownCollection()
 | 
						|
 | 
						|
	markdownToDeleteIndex := -1
 | 
						|
	for i, d := range collection.Values {
 | 
						|
		if d.DocumentId == documentId {
 | 
						|
			markdownToDeleteIndex = i
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if markdownToDeleteIndex < 0 {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	collection.Values[markdownToDeleteIndex] = collection.Values[len(collection.Values)-1]
 | 
						|
	collection.Values = collection.Values[:len(collection.Values)-1]
 | 
						|
	return true
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) GetUserMarkdownByDocumentId(documentId string) entities.UserMarkdown {
 | 
						|
	foundUserMarkdown := document.GetUserMarkdownCollection().GetUserMarkdownByDocumentId((documentId))
 | 
						|
	return entities.UserMarkdown(*foundUserMarkdown)
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestAddDocumentGroup(name string) entities.Group {
 | 
						|
	groupCollection := document.GetGroupCollection()
 | 
						|
 | 
						|
	newGroup := entities.Group{
 | 
						|
		Id:        uuid.NewString(),
 | 
						|
		Name:      name,
 | 
						|
		ProjectId: session.GetInstance().Project.Id,
 | 
						|
		Order:     len(groupCollection.Groups),
 | 
						|
	}
 | 
						|
 | 
						|
	groupCollection.AddDocumentGroup(newGroup)
 | 
						|
 | 
						|
	return newGroup
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestChangeGroupOrder(groupId string, newOrder int) entities.Group {
 | 
						|
	groupCollection := document.GetGroupCollection()
 | 
						|
 | 
						|
	for _, g := range groupCollection.Groups {
 | 
						|
		if g.Id == groupId {
 | 
						|
			document.GetGroupCollection().GetGroupById(groupId).Order = newOrder
 | 
						|
		} else if g.Order >= newOrder {
 | 
						|
			document.GetGroupCollection().GetGroupById(groupId).Order = g.Order + 1
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return *document.GetGroupCollection().GetGroupById(groupId)
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) GetAreaById(areaId string) entities.Area {
 | 
						|
	foundDocument := document.GetDocumentCollection().GetDocumentByAreaId(areaId)
 | 
						|
 | 
						|
	if len(foundDocument.Areas) == 0 {
 | 
						|
		return entities.Area{}
 | 
						|
	}
 | 
						|
 | 
						|
	var foundArea entities.Area
 | 
						|
	for i, a := range foundDocument.Areas {
 | 
						|
		if a.Id == areaId {
 | 
						|
			foundArea = foundDocument.Areas[i]
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return foundArea
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestAddArea(documentId string, area entities.Area) entities.Area {
 | 
						|
	foundDocument := document.GetDocumentCollection().GetDocumentById(documentId)
 | 
						|
 | 
						|
	var id string
 | 
						|
	if area.Id == "" {
 | 
						|
		id = uuid.NewString()
 | 
						|
	} else {
 | 
						|
		id = area.Id
 | 
						|
	}
 | 
						|
 | 
						|
	order := area.Order
 | 
						|
	if order < 1 {
 | 
						|
		order = len(foundDocument.Areas)
 | 
						|
	}
 | 
						|
 | 
						|
	newArea := entities.Area{
 | 
						|
		Id:       id,
 | 
						|
		Name:     area.Name,
 | 
						|
		StartX:   area.StartX,
 | 
						|
		EndX:     area.EndX,
 | 
						|
		StartY:   area.StartY,
 | 
						|
		EndY:     area.EndY,
 | 
						|
		Order:    order,
 | 
						|
		Language: entities.Language(area.Language),
 | 
						|
	}
 | 
						|
	foundDocument.AddArea(newArea)
 | 
						|
 | 
						|
	return newArea
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestUpdateArea(updatedArea entities.Area) bool {
 | 
						|
	documentOfArea := document.GetDocumentCollection().GetDocumentByAreaId(updatedArea.Id)
 | 
						|
 | 
						|
	if documentOfArea.Id == "" {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	areaToUpdate := documentOfArea.GetAreaById(updatedArea.Id)
 | 
						|
 | 
						|
	if areaToUpdate.Id == "" {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	if updatedArea.Name != "" {
 | 
						|
		areaToUpdate.Name = updatedArea.Name
 | 
						|
	}
 | 
						|
	if updatedArea.Order != areaToUpdate.Order {
 | 
						|
		areaToUpdate.Order = updatedArea.Order
 | 
						|
	}
 | 
						|
	if updatedArea.Language.ProcessCode != "" {
 | 
						|
		areaToUpdate.Language = updatedArea.Language
 | 
						|
	}
 | 
						|
 | 
						|
	fmt.Println(areaToUpdate.Language)
 | 
						|
	fmt.Println(documentOfArea.GetAreaById(updatedArea.Id))
 | 
						|
 | 
						|
	return true
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestDeleteAreaById(areaId string) bool {
 | 
						|
	documentOfArea := document.GetDocumentCollection().GetDocumentByAreaId(areaId)
 | 
						|
 | 
						|
	if documentOfArea.Id == "" {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	areaToDeleteIndex := -1
 | 
						|
 | 
						|
	for i, a := range documentOfArea.Areas {
 | 
						|
		if a.Id == areaId {
 | 
						|
			areaToDeleteIndex = i
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if areaToDeleteIndex < 0 {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	documentOfArea.Areas[areaToDeleteIndex] = documentOfArea.Areas[len(documentOfArea.Areas)-1]
 | 
						|
	documentOfArea.Areas = documentOfArea.Areas[:len(documentOfArea.Areas)-1]
 | 
						|
	return true
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestUpdateDocument(updatedDocument entities.Document) entities.Document {
 | 
						|
	documentToUpdate := document.GetDocumentCollection().GetDocumentById(updatedDocument.Id)
 | 
						|
 | 
						|
	if documentToUpdate == nil {
 | 
						|
		return entities.Document{}
 | 
						|
	}
 | 
						|
 | 
						|
	if updatedDocument.Id != "" {
 | 
						|
		documentToUpdate.Id = updatedDocument.Id
 | 
						|
	}
 | 
						|
	if updatedDocument.Name != "" {
 | 
						|
		documentToUpdate.Name = updatedDocument.Name
 | 
						|
	}
 | 
						|
	if updatedDocument.GroupId != "" {
 | 
						|
		documentToUpdate.GroupId = updatedDocument.GroupId
 | 
						|
	}
 | 
						|
	if updatedDocument.Path != "" {
 | 
						|
		documentToUpdate.Path = updatedDocument.Path
 | 
						|
	}
 | 
						|
	if updatedDocument.DefaultLanguage.DisplayName != "" {
 | 
						|
		documentToUpdate.DefaultLanguage = updatedDocument.DefaultLanguage
 | 
						|
	}
 | 
						|
 | 
						|
	return updatedDocument
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestChangeAreaOrder(areaId string, newOrder int) entities.Document {
 | 
						|
	documentOfArea := document.GetDocumentCollection().GetDocumentByAreaId((areaId))
 | 
						|
 | 
						|
	if documentOfArea == nil {
 | 
						|
		return entities.Document{}
 | 
						|
	}
 | 
						|
 | 
						|
	var foundArea entities.Area
 | 
						|
	for _, a := range documentOfArea.Areas {
 | 
						|
		if a.Id == areaId {
 | 
						|
			foundArea = a
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if foundArea.Id == "" {
 | 
						|
		return entities.Document{}
 | 
						|
	}
 | 
						|
 | 
						|
	processedAreasCollection := document.GetProcessedAreaCollection()
 | 
						|
 | 
						|
	for index, a := range documentOfArea.Areas {
 | 
						|
		if a.Id == areaId {
 | 
						|
			documentOfArea.Areas[index].Order = newOrder
 | 
						|
			foundProcessedArea := processedAreasCollection.GetAreaById(a.Id)
 | 
						|
			if foundProcessedArea != nil {
 | 
						|
				foundProcessedArea.Order = newOrder
 | 
						|
			}
 | 
						|
		} else if a.Order >= newOrder {
 | 
						|
			documentOfArea.Areas[index].Order = a.Order + 1
 | 
						|
			foundProcessedArea := processedAreasCollection.GetAreaById(a.Id)
 | 
						|
			if foundProcessedArea != nil {
 | 
						|
				foundProcessedArea.Order = a.Order + 1
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return c.GetDocumentById(documentOfArea.Id)
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestSaveDocumentCollection() bool {
 | 
						|
	documentCollection := document.GetDocumentCollection()
 | 
						|
	projectName := c.GetCurrentSession().Project.Name
 | 
						|
 | 
						|
	fullProject := storage.GetDriver().ReadProjectDataByName(projectName)
 | 
						|
 | 
						|
	if fullProject.Id == "" {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	documentCount := len(documentCollection.Documents)
 | 
						|
	writableDocuments := make([]entities.Document, documentCount)
 | 
						|
	for i := 0; i < documentCount; i++ {
 | 
						|
		writableDocuments[i] = entities.Document(documentCollection.Documents[i])
 | 
						|
	}
 | 
						|
 | 
						|
	successfulWrite := storage.GetDriver().WriteDocumentCollection(
 | 
						|
		entities.DocumentCollection{
 | 
						|
			ProjectId: fullProject.Id,
 | 
						|
			Documents: writableDocuments,
 | 
						|
		},
 | 
						|
		projectName)
 | 
						|
 | 
						|
	return successfulWrite
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestSaveGroupCollection() bool {
 | 
						|
	groupCollection := document.GetGroupCollection()
 | 
						|
	projectName := c.GetCurrentSession().Project.Name
 | 
						|
 | 
						|
	fullProject := storage.GetDriver().ReadProjectDataByName(projectName)
 | 
						|
 | 
						|
	if fullProject.Id == "" {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	groupCount := len(groupCollection.Groups)
 | 
						|
	writableGroups := make([]entities.Group, groupCount)
 | 
						|
	for i := 0; i < groupCount; i++ {
 | 
						|
		writableGroups[i] = entities.Group(groupCollection.Groups[i])
 | 
						|
	}
 | 
						|
 | 
						|
	successfulWrite := storage.GetDriver().WriteGroupCollection(entities.GroupCollection{
 | 
						|
		Id:        groupCollection.Id,
 | 
						|
		ProjectId: groupCollection.ProjectId,
 | 
						|
		Groups:    writableGroups,
 | 
						|
	}, projectName)
 | 
						|
 | 
						|
	return successfulWrite
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestSaveProcessedTextCollection() bool {
 | 
						|
	processedAreaCollection := document.GetProcessedAreaCollection()
 | 
						|
	projectName := c.GetCurrentSession().Project.Name
 | 
						|
 | 
						|
	processedAreasCount := len(processedAreaCollection.Areas)
 | 
						|
	writableProcessedAreasAreas := make([]entities.ProcessedArea, processedAreasCount)
 | 
						|
	for i := 0; i < processedAreasCount; i++ {
 | 
						|
		writableProcessedAreasAreas[i] = entities.ProcessedArea(processedAreaCollection.Areas[i])
 | 
						|
	}
 | 
						|
 | 
						|
	successfulWrite := storage.GetDriver().WriteProcessedTextCollection(
 | 
						|
		entities.ProcessedTextCollection{
 | 
						|
			Areas: writableProcessedAreasAreas,
 | 
						|
		},
 | 
						|
		projectName,
 | 
						|
	)
 | 
						|
	return successfulWrite
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestSaveLocalUserProcessedMarkdownCollection() bool {
 | 
						|
	userProcessedMarkdownCollection := document.GetUserMarkdownCollection()
 | 
						|
	projectName := c.GetCurrentSession().Project.Name
 | 
						|
 | 
						|
	fullProject := storage.GetDriver().ReadProjectDataByName(projectName)
 | 
						|
 | 
						|
	if fullProject.Id == "" {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	groupCount := len(userProcessedMarkdownCollection.Values)
 | 
						|
	writableMarkdownValues := make([]entities.ProcessedUserMarkdown, groupCount)
 | 
						|
	for i := 0; i < groupCount; i++ {
 | 
						|
		writableMarkdownValues[i] = entities.ProcessedUserMarkdown(userProcessedMarkdownCollection.Values[i])
 | 
						|
	}
 | 
						|
 | 
						|
	successfulWrite := storage.GetDriver().WriteProcessedUserMarkdownCollection(
 | 
						|
		entities.ProcessedUserMarkdownCollection{
 | 
						|
			Values: writableMarkdownValues,
 | 
						|
		},
 | 
						|
		projectName,
 | 
						|
	)
 | 
						|
 | 
						|
	return successfulWrite
 | 
						|
}
 | 
						|
 | 
						|
func (c *Channel) RequestDeleteDocumentAndChildren(documentId string) bool {
 | 
						|
	success := true
 | 
						|
 | 
						|
	deletedDocument := c.deleteDocumentById(documentId)
 | 
						|
	if !deletedDocument {
 | 
						|
		success = false
 | 
						|
	}
 | 
						|
 | 
						|
	deletedUserMarkDown := c.deleteDocumentUserMarkdown(documentId)
 | 
						|
	if !deletedUserMarkDown {
 | 
						|
		success = false
 | 
						|
	}
 | 
						|
 | 
						|
	return success
 | 
						|
}
 |