
* 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
|
|
}
|