@@ -212,6 +212,119 @@ QString Note::getNextcloudNotesLink() const {
212212 return link;
213213}
214214
215+ /* *
216+ * @brief Get a unique identifier for this note (subfolder path + filename)
217+ * @return Unique identifier string
218+ */
219+ QString Note::getFavoriteIdentifier () const {
220+ // Combine subfolder path and filename to create a unique identifier
221+ QString subFolderPath = relativeNoteSubFolderPath ();
222+ if (subFolderPath.isEmpty ()) {
223+ return _fileName;
224+ }
225+ return subFolderPath + QStringLiteral (" /" ) + _fileName;
226+ }
227+
228+ /* *
229+ * @brief Check if this note is marked as favorite
230+ * @return true if the note is favorite, false otherwise
231+ */
232+ bool Note::isFavorite () const {
233+ const QStringList favoriteIdentifiers = getFavoriteNoteIdentifiers ();
234+ return favoriteIdentifiers.contains (getFavoriteIdentifier ());
235+ }
236+
237+ /* *
238+ * @brief Toggle the favorite status of this note
239+ * @return true if the note is now favorite, false otherwise
240+ */
241+ bool Note::toggleFavorite () {
242+ NoteFolder noteFolder = NoteFolder::currentNoteFolder ();
243+ QStringList favoriteIdentifiers = getFavoriteNoteIdentifiers ();
244+ QString identifier = getFavoriteIdentifier ();
245+
246+ bool wasFavorite = favoriteIdentifiers.contains (identifier);
247+
248+ if (wasFavorite) {
249+ // Remove from favorites
250+ favoriteIdentifiers.removeAll (identifier);
251+ } else {
252+ // Add to favorites
253+ favoriteIdentifiers.append (identifier);
254+ }
255+
256+ // Store the updated list
257+ noteFolder.setSettingsValue (QStringLiteral (" favoriteNoteIdentifiers" ), favoriteIdentifiers);
258+
259+ return !wasFavorite;
260+ }
261+
262+ /* *
263+ * @brief Get the list of favorite note identifiers for the current note folder
264+ * @return List of favorite note identifiers (subfolderPath/filename)
265+ */
266+ QStringList Note::getFavoriteNoteIdentifiers () {
267+ NoteFolder noteFolder = NoteFolder::currentNoteFolder ();
268+ return noteFolder.settingsValue (QStringLiteral (" favoriteNoteIdentifiers" )).toStringList ();
269+ }
270+
271+ /* *
272+ * @brief Migrate a favorite note identifier when a note is moved
273+ * @param oldIdentifier The old identifier (before the move)
274+ */
275+ void Note::migrateFavoriteIdentifier (const QString &oldIdentifier) {
276+ QStringList favoriteIdentifiers = getFavoriteNoteIdentifiers ();
277+
278+ // Check if the old identifier was in the favorites list
279+ if (favoriteIdentifiers.contains (oldIdentifier)) {
280+ // Remove the old identifier
281+ favoriteIdentifiers.removeAll (oldIdentifier);
282+
283+ // Add the new identifier
284+ QString newIdentifier = getFavoriteIdentifier ();
285+ if (!favoriteIdentifiers.contains (newIdentifier)) {
286+ favoriteIdentifiers.append (newIdentifier);
287+ }
288+
289+ // Store the updated list
290+ NoteFolder noteFolder = NoteFolder::currentNoteFolder ();
291+ noteFolder.setSettingsValue (QStringLiteral (" favoriteNoteIdentifiers" ), favoriteIdentifiers);
292+
293+ qDebug () << __func__ << " Migrated favorite from" << oldIdentifier << " to" << newIdentifier;
294+ }
295+ }
296+
297+ /* *
298+ * @brief Clean up favorite notes list by removing entries for notes that no longer exist
299+ */
300+ void Note::cleanupFavoriteNotes () {
301+ NoteFolder noteFolder = NoteFolder::currentNoteFolder ();
302+ QStringList favoriteIdentifiers = getFavoriteNoteIdentifiers ();
303+ QStringList validIdentifiers;
304+
305+ QString noteFolderPath = noteFolder.getLocalPath ();
306+
307+ for (const QString &identifier : favoriteIdentifiers) {
308+ // Build the full file path
309+ QString filePath = noteFolderPath + QDir::separator () + identifier;
310+
311+ // Check if the file exists
312+ QFile file (filePath);
313+ if (file.exists ()) {
314+ validIdentifiers.append (identifier);
315+ } else {
316+ qDebug () << __func__ << " Removing non-existent favorite:" << identifier;
317+ }
318+ }
319+
320+ // Only update if something changed
321+ if (validIdentifiers.count () != favoriteIdentifiers.count ()) {
322+ noteFolder.setSettingsValue (QStringLiteral (" favoriteNoteIdentifiers" ), validIdentifiers);
323+ qDebug () << __func__ << " Cleaned up"
324+ << (favoriteIdentifiers.count () - validIdentifiers.count ()) << " favorite entries" ;
325+ }
326+ }
327+
215328void Note::setCryptoKey (const qint64 cryptoKey) { this ->_cryptoKey = cryptoKey; }
216329
217330void Note::setNoteText (QString text) { this ->_noteText = std::move (text); }
@@ -363,6 +476,17 @@ bool Note::remove(bool withFile) {
363476 return false ;
364477 } else {
365478 if (withFile) {
479+ // Remove from favorites if it was marked as favorite
480+ QString identifier = getFavoriteIdentifier ();
481+ QStringList favoriteIdentifiers = getFavoriteNoteIdentifiers ();
482+ if (favoriteIdentifiers.contains (identifier)) {
483+ favoriteIdentifiers.removeAll (identifier);
484+ NoteFolder noteFolder = NoteFolder::currentNoteFolder ();
485+ noteFolder.setSettingsValue (QStringLiteral (" favoriteNoteIdentifiers" ),
486+ favoriteIdentifiers);
487+ qDebug () << __func__ << " Removed favorite:" << identifier;
488+ }
489+
366490 this ->removeNoteFile ();
367491
368492 // remove all links to tags
@@ -3876,6 +4000,13 @@ bool Note::handleNoteMoving(Note oldNote) {
38764000 const int noteCount = noteIdList.count ();
38774001 bool result = false ;
38784002
4003+ // Migrate favorite status if the note was moved to a different subfolder or renamed
4004+ QString oldIdentifier = oldNote.getFavoriteIdentifier ();
4005+ QString newIdentifier = getFavoriteIdentifier ();
4006+ if (oldIdentifier != newIdentifier) {
4007+ migrateFavoriteIdentifier (oldIdentifier);
4008+ }
4009+
38794010 // Handle incoming note links
38804011 if (noteCount > 0 ) {
38814012 result = handleBacklinkedNotesAfterMoving (oldNote, noteIdList);
0 commit comments