File: ProjectSnap.cpp

package info (click to toggle)
audacity 3.7.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 125,252 kB
  • sloc: cpp: 358,238; ansic: 75,458; lisp: 7,761; sh: 3,410; python: 1,503; xml: 1,385; perl: 854; makefile: 122
file content (121 lines) | stat: -rw-r--r-- 3,161 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*  SPDX-License-Identifier: GPL-2.0-or-later */
/*!********************************************************************

  Audacity: A Digital Audio Editor

  ProjectSnap.cpp

  Dmitry Vedenko

**********************************************************************/
#include "ProjectSnap.h"
#include "Project.h"
#include "XMLWriter.h"
#include "XMLAttributeValueView.h"

#include "ProjectRate.h"
#include "ProjectTimeSignature.h"

static const AudacityProject::AttachedObjects::RegisteredFactory sKey {
   [](AudacityProject& project)
   {
      auto result = std::make_shared<ProjectSnap>(project);
      return result;
   }
};

ProjectSnap& ProjectSnap::Get(AudacityProject& project)
{
   return project.AttachedObjects::Get<ProjectSnap>(sKey);
}

const ProjectSnap& ProjectSnap::Get(const AudacityProject& project)
{
   return Get(const_cast<AudacityProject&>(project));
}

ProjectSnap::ProjectSnap(const AudacityProject& project)
    : mProject(project)
{}

void ProjectSnap::SetSnapMode(SnapMode mode)
{
   if (mSnapMode != mode)
   {
      mSnapMode = mode;
      
      SnapModeSetting.WriteEnum(mSnapMode);
      gPrefs->Flush();

      Publish(SnapChangedMessage { mode, mSnapTo });
   }
}

SnapMode ProjectSnap::GetSnapMode() const
{
   return mSnapMode;
}

void ProjectSnap::SetSnapTo(Identifier snap)
{
   if (mSnapTo != snap)
   {
      mSnapTo = snap;

      SnapToSetting.Write(mSnapTo.GET());
      gPrefs->Flush();

      Publish(SnapChangedMessage { mSnapMode, snap });
   }
}

Identifier ProjectSnap::GetSnapTo() const
{
   return mSnapTo;
}

SnapResult ProjectSnap::SnapTime(double time) const
{
   if (mSnapMode == SnapMode::SNAP_OFF)
      return { time, false };

   return SnapFunctionsRegistry::Snap(mSnapTo, mProject, time, mSnapMode == SnapMode::SNAP_NEAREST);
}

SnapResult ProjectSnap::SingleStep(double time, bool upwards) const
{
   if (mSnapMode == SnapMode::SNAP_OFF)
      return { time, false };

   return SnapFunctionsRegistry::SingleStep(mSnapTo, mProject, time, upwards);
}

static ProjectFileIORegistry::AttributeWriterEntry entry {
   [](const AudacityProject& project, XMLWriter& xmlFile)
   {
      // Keep this attr for compatibility
      auto& snapSettings = ProjectSnap::Get(project);
      xmlFile.WriteAttr(
         wxT("snapto"), snapSettings.GetSnapMode() != SnapMode::SNAP_OFF ?
                           wxT("on") :
                           wxT("off"));
   }
};

static ProjectFileIORegistry::AttributeReaderEntries entries {
   // Just a pointer to function, but needing overload resolution as non-const:
   (ProjectSnap & (*)(AudacityProject&)) & ProjectSnap::Get,
   {
      // PRL:  The following has persisted as a per-project setting for long.
      // Maybe that should be abandoned.  Enough to save changes in the user
      // preference file.
      // DV: Keep the old behavior here: project only stored *off* and *nearest*
      { "snapto",
        [](auto& snapSettings, auto value)
        {
           snapSettings.SetSnapMode(
              value.ToWString() == wxT("on") ? SnapMode::SNAP_NEAREST :
                                               SnapMode::SNAP_OFF);
        } },
   }
};