@@ -7,6 +7,7 @@ local JSON = require "ext/json"
77local CheckboxHelper = require " modules/checkbox_helper"
88local Sticker = require " classes/sticker"
99local D = require " modules/defines"
10+ local PS = require " modules/project_settings"
1011
1112local 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
4552end
4653
4754local 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)
6276end
6377
6478local 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
7090end
7191
7292local 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 )
188217end
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+
190232local 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)
203251end
204252
205253local 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 )
249303end
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
260321end
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+
262349function 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
308395end
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+
310445function Notes :slotStickers (slot )
311446 if slot == 0 then
312447 return self .reannotate_notes .sws_reaper_stickers or {}
0 commit comments