Skip to content

Commit ad20a5d

Browse files
authored
Update Reannotate v0.4.3 > v0.4.4 (#1694)
1 parent 32505e7 commit ad20a5d

File tree

15 files changed

+874
-320
lines changed

15 files changed

+874
-320
lines changed

Various/talagan_Reannotate.lua

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
--[[
22
@description Reannotate - Annotation tool for REAPER
3-
@version 0.4.3
3+
@version 0.4.4
44
@author Ben 'Talagan' Babut
55
@donation https://www.paypal.com/donate/?business=3YEZMY9D6U8NC&no_recurring=1&currency_code=EUR
66
@license MIT
@@ -10,12 +10,10 @@
1010
Forum Thread https://forum.cockos.com/showthread.php?t=304147
1111
@metapackage
1212
@changelog
13-
- [Feature] The markdown stylesheet is now customizable
14-
- [Feature] UI Font size is now customizable
15-
- [Feature] Note editor's width is now remembered
16-
- [Bug Fix] Tooltips with vertical scrollbars could affect the layout of other tooltips shown immediately after
17-
- [Rework] Moved project notes to the transport zone instead of the time ruler (will be used for regions / markers ?)
18-
- [Rework] Optimizations
13+
- [Feature] Posters
14+
- [Feature] Can now add annotations to regions
15+
- [Feature] Progress bar sticker
16+
- [Bug fixes] Various bug fixes
1917
@provides
2018
[nomain] talagan_Reannotate/ext/**/*
2119
[nomain] talagan_Reannotate/classes/**/*

Various/talagan_Reannotate/classes/app_context.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ function AppContext:_initialize()
131131
AppContext.__singleton = self
132132
end
133133

134+
-- Return absolute coordinates, normalized by ImGui PointConvertNative.
135+
-- These coordinates are meant to be used with drawlists essentially.
136+
-- Scrollbar corrections may be passed.
137+
-- DPI is applied if there's scaling under windows
134138
function AppContext:retrieveCoordinates(sub, scrollbar_w, scrollbar_h)
135139
if not sub.hwnd then return end
136140
local _, x, y, x2, y2 = reaper.JS_Window_GetRect(sub.hwnd)

Various/talagan_Reannotate/classes/mem_cache.lua

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,13 @@ end
2323

2424
function MemCache.GetObjectGUID(object)
2525
local guid = ''
26-
if reaper.ValidatePtr(object, "MediaTrack*") then
26+
if type(object) == "table" then
27+
if object.t == 'region' then
28+
return object.guid
29+
else
30+
error("Unhandled custom type " .. object.t .. " for object")
31+
end
32+
elseif reaper.ValidatePtr(object, "MediaTrack*") then
2733
local tguid = reaper.GetTrackGUID(object)
2834
guid = tguid
2935
elseif reaper.ValidatePtr(object,"MediaItem*") then
@@ -49,24 +55,31 @@ function MemCache:getObjectCache(object)
4955
-- Build object cache
5056

5157
local name = ''
52-
local type = ''
53-
if reaper.ValidatePtr(object, "MediaTrack*") then
58+
local kind = ''
59+
if type(object) == "table" then
60+
if object.t == 'region' then
61+
name = object.n or ''
62+
kind = object.t
63+
else
64+
error("Unhandled custom type " .. object.t .. " for object")
65+
end
66+
elseif reaper.ValidatePtr(object, "MediaTrack*") then
5467
local _, tname = reaper.GetTrackName(object)
5568
name = tname
56-
type = 'track'
69+
kind = 'track'
5770
elseif reaper.ValidatePtr(object,"MediaItem*") then
5871
local take = reaper.GetActiveTake(object)
5972
if take then
6073
name = reaper.GetTakeName(take)
6174
end
62-
type = 'item'
75+
kind = 'item'
6376
elseif reaper.ValidatePtr(object, "TrackEnvelope*") then
6477
local _, ename = reaper.GetEnvelopeName(object)
6578
name = ename
66-
type = 'env'
79+
kind = 'env'
6780
elseif reaper.ValidatePtr(object, "ReaProject*") then
6881
name = "Project"
69-
type = 'project'
82+
kind = 'project'
7083
else
7184
error("Unhandled type for object")
7285
end
@@ -76,7 +89,7 @@ function MemCache:getObjectCache(object)
7689
guid = guid,
7790
object = object,
7891
name = name,
79-
type = type,
92+
type = kind,
8093
-- Notes cache
8194
notes = Notes:new(object)
8295
}

Various/talagan_Reannotate/classes/notes.lua

Lines changed: 144 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ local JSON = require "ext/json"
77
local CheckboxHelper = require "modules/checkbox_helper"
88
local Sticker = require "classes/sticker"
99
local D = require "modules/defines"
10+
local PS = require "modules/project_settings"
1011

1112
local function normalizeNotes(str)
1213
return str:gsub("\r","")
@@ -23,6 +24,7 @@ local function normalizeReannotateData(data)
2324
if not data.slots then data.slots = {} end
2425
if not data.stickers then data.stickers = {} end
2526
if not data.cb then data.cb = {} end
27+
if not data.posters then data.posters = {} end
2628

2729
for i=1, D.MAX_SLOTS-1 do
2830
data.slots[i] = data.slots[i] or "" -- Stored text
@@ -31,6 +33,9 @@ local function normalizeReannotateData(data)
3133
data.tt_sizes[i].h = normalizeCoordinate(data.tt_sizes[i].h, D.TT_DEFAULT_H)
3234
data.stickers[i] = data.stickers[i] or {} -- List or empty list of packed stickers
3335
data.cb[i] = data.cb[i] or {} -- Checkbox cache
36+
data.posters[i] = data.posters[i] or {}
37+
data.posters[i].t = data.posters[i].t or D.POSTER_TYPES.PROJECT_DEFAULT
38+
data.posters[i].s = data.posters[i].s or ""
3439
end
3540

3641
-- Special treatment for slot 0
@@ -39,14 +44,23 @@ local function normalizeReannotateData(data)
3944
data.sws_reaper_tt_size.h = normalizeCoordinate(data.sws_reaper_tt_size.h, D.TT_DEFAULT_H)
4045
data.sws_reaper_stickers = data.sws_reaper_stickers or {}
4146
data.sr_cb = data.sr_cb or {}
47+
data.sws_reaper_poster = data.sws_reaper_poster or {}
48+
data.sws_reaper_poster.t = data.sws_reaper_poster.t or D.POSTER_TYPES.PROJECT_DEFAULT
49+
data.sws_reaper_poster.s = data.sws_reaper_poster.s or ""
4250
-- data.sws_reaper_text <-- stored in reaper / SWS
43-
4451
return data
4552
end
4653

4754
local function AttributeGetterSetter(object)
4855
local getter = nil
49-
if reaper.ValidatePtr(object, "MediaTrack*") then
56+
if type(object) == 'table' then
57+
if object.t == 'region' then
58+
-- We'll store on the master track with a different ke
59+
getter = reaper.GetSetMediaTrackInfo_String
60+
else
61+
error("Unhandled custom type " .. object.t .. " for object ")
62+
end
63+
elseif reaper.ValidatePtr(object, "MediaTrack*") then
5064
getter = reaper.GetSetMediaTrackInfo_String
5165
elseif reaper.ValidatePtr(object, "TrackEnvelope*") then
5266
getter = reaper.GetSetEnvelopeInfo_String
@@ -62,15 +76,27 @@ local function AttributeGetterSetter(object)
6276
end
6377

6478
local function StoreKey(object)
65-
if reaper.ValidatePtr(object, "ReaProject*") then
79+
if type(object) == 'table' then
80+
if object.t == 'region' then
81+
return "P_EXT:Reannotate_RegionNotes:" .. object.guid
82+
else
83+
error("Unhandled custom type " .. object.t .. " for object ")
84+
end
85+
elseif reaper.ValidatePtr(object, "ReaProject*") then
6686
return "P_EXT:Reannotate_ProjectNotes"
6787
else
6888
return "P_EXT:Reannotate_Notes"
6989
end
7090
end
7191

7292
local function StoreObject(object)
73-
if reaper.ValidatePtr(object, "ReaProject*") then
93+
if type(object) == 'table' then
94+
if object.t == 'region' then
95+
return reaper.GetMasterTrack(D.ActiveProject())
96+
else
97+
error("Unhandled custom type " .. object.t .. " for object ")
98+
end
99+
elseif reaper.ValidatePtr(object, "ReaProject*") then
74100
return reaper.GetMasterTrack(D.ActiveProject())
75101
else
76102
return object
@@ -109,12 +135,14 @@ local function SetObjectNotes_Reannotate(object, data)
109135
-- SWS/Reaper additional
110136
sws_reaper_tt_size = data.sws_reaper_tt_size,
111137
sr_cb = data.sr_cb,
138+
sws_reaper_stickers = {},
139+
sws_reaper_poster = D.deepCopy(data.sws_reaper_poster),
112140
-- Reannotate structures
113141
tt_sizes = data.tt_sizes,
114142
slots = data.slots,
115143
cb = data.cb,
116144
stickers = {},
117-
sws_reaper_stickers = {}
145+
posters = D.deepCopy(data.posters)
118146
}
119147

120148
-- Serialize stickers
@@ -123,6 +151,7 @@ local function SetObjectNotes_Reannotate(object, data)
123151
end
124152
new_data.sws_reaper_stickers = Sticker.PackCollection(data.sws_reaper_stickers)
125153

154+
-- Normalize before packing
126155
new_data = normalizeReannotateData(new_data)
127156

128157
local data_str = JSON.encode(new_data)
@@ -187,9 +216,28 @@ local function SetActiveProjectNotes_SWS_Reaper(str)
187216
return reaper.GetSetProjectNotes(project, true, notes)
188217
end
189218

219+
-------------
220+
-- REGION --
221+
-------------
222+
223+
local function GetRegionNotes_SWS_Reaper(object)
224+
-- Not handled by SWS
225+
return true, ""
226+
end
227+
local function SetRegionNotes_SWS_Reaper(object, str)
228+
-- Not handled by SWS
229+
return true, ""
230+
end
231+
190232
local function GetObjectNotes_SWS_Reaper(notes)
191233
local object = notes._object
192-
if reaper.ValidatePtr(object, "MediaTrack*") then
234+
if type(object) == 'table' then
235+
if object.t == 'region' then
236+
return GetRegionNotes_SWS_Reaper(object)
237+
else
238+
error("Unhandled custom type " .. object.t .. " for object ")
239+
end
240+
elseif reaper.ValidatePtr(object, "MediaTrack*") then
193241
return GetTrackNotes_SWS_Reaper(object)
194242
elseif reaper.ValidatePtr(object, "TrackEnvelope*") then
195243
return GetEnvelopeNotes_SWS_Reaper(object)
@@ -203,7 +251,13 @@ local function GetObjectNotes_SWS_Reaper(notes)
203251
end
204252

205253
local function SetObjectNotes_SWS_Reaper(object, str)
206-
if reaper.ValidatePtr(object, "MediaTrack*") then
254+
if type(object) == 'table' then
255+
if object.t == 'region' then
256+
return SetRegionNotes_SWS_Reaper(object, str)
257+
else
258+
error("Unhandled custom type " .. object.t .. " for object ")
259+
end
260+
elseif reaper.ValidatePtr(object, "MediaTrack*") then
207261
return SetTrackNotes_SWS_Reaper(object, str)
208262
elseif reaper.ValidatePtr(object,"TrackEnvelope*") then
209263
return SetEnvelopeNotes_SWS_Reaper(object, str)
@@ -248,17 +302,50 @@ function Notes:commit()
248302
SetObjectNotes_SWS_Reaper(self._object, self.sws_reaper_notes)
249303
end
250304

251-
function Notes:isSlotBlank(slot)
305+
function Notes:isSlotNoteBlank(slot)
252306
if slot == 0 then
253307
if self.sws_reaper_notes and self.sws_reaper_notes ~= "" then return false end
254-
if #self.reannotate_notes.sws_reaper_stickers > 0 then return false end
255308
else
256309
if self.reannotate_notes.slots[slot] and self.reannotate_notes.slots[slot] ~= '' then return false end
310+
end
311+
return true
312+
end
313+
314+
function Notes:isSlotStickersBlank(slot)
315+
if slot == 0 then
316+
if #self.reannotate_notes.sws_reaper_stickers > 0 then return false end
317+
else
257318
if #self.reannotate_notes.stickers[slot] > 0 then return false end
258319
end
259320
return true
260321
end
261322

323+
function Notes:isSlotPosterBlank(slot)
324+
local type = self:resolvedSlotPosterType(slot)
325+
if type == D.POSTER_TYPES.NO_POSTER then
326+
return true
327+
elseif type == D.POSTER_TYPES.CUSTOM_PLAIN_POSTER or type == D.POSTER_TYPES.CUSTOM_MARKDOWN_POSTER then
328+
-- If in custom mode, check custom poster
329+
if slot == 0 then
330+
if self.reannotate_notes.sws_reaper_poster and self.reannotate_notes.sws_reaper_poster.s ~= "" then return false end
331+
else
332+
if self.reannotate_notes.posters[slot] and self.reannotate_notes.posters[slot].s ~= '' then return false end
333+
end
334+
return true
335+
else
336+
-- If not in custom mode, check note
337+
return self:isSlotNoteBlank(slot)
338+
end
339+
end
340+
341+
function Notes:isSlotBlank(slot)
342+
if not self:isSlotNoteBlank(slot) then return false end
343+
if not self:isSlotStickersBlank(slot) then return false end
344+
if not self:isSlotPosterBlank(slot) then return false end
345+
346+
return true
347+
end
348+
262349
function Notes:isBlank()
263350
for slot=0, D.MAX_SLOTS -1 do
264351
if not self:isSlotBlank(slot) then return false end
@@ -307,6 +394,54 @@ function Notes:setSlotText(slot, str)
307394
end
308395
end
309396

397+
function Notes:resolvedSlotPosterType(slot)
398+
local type = self:slotPosterType(slot)
399+
if type == D.POSTER_TYPES.PROJECT_DEFAULT then
400+
return PS.ProjectPosterDefaultType()
401+
end
402+
return type
403+
end
404+
405+
function Notes:slotCustomPoster(slot)
406+
if slot == 0 then
407+
self.reannotate_notes.sws_reaper_poster = self.reannotate_notes.sws_reaper_poster or { t = D.POSTER_TYPES.PROJECT_DEFAULT, s = '' }
408+
return self.reannotate_notes.sws_reaper_poster.s
409+
else
410+
self.reannotate_notes.posters[slot] = self.reannotate_notes.posters[slot] or { t = D.POSTER_TYPES.PROJECT_DEFAULT, s = '' }
411+
return self.reannotate_notes.posters[slot].s
412+
end
413+
end
414+
function Notes:setSlotCustomPoster(slot, str)
415+
if slot == 0 then
416+
self.reannotate_notes.sws_reaper_poster = self.reannotate_notes.sws_reaper_poster or { t = D.POSTER_TYPES.PROJECT_DEFAULT, s = '' }
417+
self.reannotate_notes.sws_reaper_poster.s = str
418+
else
419+
self.reannotate_notes.posters[slot] = self.reannotate_notes.posters[slot] or { t = D.POSTER_TYPES.PROJECT_DEFAULT, s = '' }
420+
self.reannotate_notes.posters[slot].s = str
421+
end
422+
end
423+
424+
425+
function Notes:slotPosterType(slot)
426+
if slot == 0 then
427+
self.reannotate_notes.sws_reaper_poster = self.reannotate_notes.sws_reaper_poster or { t = D.POSTER_TYPES.PROJECT_DEFAULT, s = '' }
428+
return self.reannotate_notes.sws_reaper_poster.t
429+
else
430+
self.reannotate_notes.posters[slot] = self.reannotate_notes.posters[slot] or { t = D.POSTER_TYPES.PROJECT_DEFAULT, s = '' }
431+
return self.reannotate_notes.posters[slot].t
432+
end
433+
end
434+
function Notes:setSlotPosterType(slot, type)
435+
if slot == 0 then
436+
self.reannotate_notes.sws_reaper_poster = self.reannotate_notes.sws_reaper_poster or { t = D.POSTER_TYPES.PROJECT_DEFAULT, s = '' }
437+
self.reannotate_notes.sws_reaper_poster.t = type
438+
else
439+
self.reannotate_notes.posters[slot] = self.reannotate_notes.posters[slot] or { t = D.POSTER_TYPES.PROJECT_DEFAULT, s = '' }
440+
self.reannotate_notes.posters[slot].t = type
441+
end
442+
end
443+
444+
310445
function Notes:slotStickers(slot)
311446
if slot == 0 then
312447
return self.reannotate_notes.sws_reaper_stickers or {}

0 commit comments

Comments
 (0)