PEBL 2.2
Psychology Experiment Building Language - Cross-platform psychological experiment development system
ScaleManager.h
Go to the documentation of this file.
1// ScaleManager.h - PEBL Scale file management
2// Copyright (c) 2026 Shane T. Mueller
3// Licensed under GPL
4
5#ifndef SCALE_MANAGER_H
6#define SCALE_MANAGER_H
7
8#include "ScaleDefinition.h"
9#include <string>
10#include <vector>
11#include <memory>
12
13// Manages scale files in media/apps/scales/ (read-only library) and workspace/scales/ (writable)
15public:
16 ScaleManager(const std::string& batteryPath, const std::string& workspacePath = "");
18
19 // Scan available scales from library and workspace
20 std::vector<std::string> GetAvailableScales();
21
22 // Create new scale
23 std::shared_ptr<ScaleDefinition> CreateScale(const std::string& code);
24
25 // Load existing scale (definition + translations)
26 std::shared_ptr<ScaleDefinition> LoadScale(const std::string& code);
27
28 // Save scale (definition + translations)
29 bool SaveScale(std::shared_ptr<ScaleDefinition> scale);
30
31 // Delete scale (definition + translations)
32 bool DeleteScale(const std::string& code);
33
34 // Export scale to battery directory
35 bool ExportToBattery(std::shared_ptr<ScaleDefinition> scale);
36
37 // Import scale from file
38 std::shared_ptr<ScaleDefinition> ImportFromFile(const std::string& filePath);
39
40 // Loose OSD files — .osd files placed directly in the workspace scales directory,
41 // not yet installed into a <code>/ subdirectory.
43 std::string path; // Full filesystem path to the .osd file
44 std::string code; // Scale code read from scale_info.code
45 std::string name; // Scale name read from scale_info.name
46 };
47 std::vector<LooseOSDEntry> GetLooseOSDEntries() const;
48
49 // Install a loose .osd file: creates workspace/scales/<code>/ and moves the file there.
50 // Returns the loaded ScaleDefinition on success, nullptr on failure.
51 std::shared_ptr<ScaleDefinition> InstallLooseOSD(const std::string& osdPath);
52
53 // Get paths
54 std::string GetDefinitionPath(const std::string& code) const;
55 std::string GetOSDPath(const std::string& code) const;
56 std::string GetTranslationPath(const std::string& code, const std::string& lang) const;
57 std::string GetBatteryPath() const { return mBatteryPath; }
58 std::string GetWorkspacePath() const { return mWorkspacePath; }
59 std::string GetBatteryScalesPath() const { return mBatteryScalesPath; }
60 std::string GetWorkspaceScalesPath() const { return mWorkspaceScalesPath; }
61
62 // Returns workspace path if available, else library path
63 std::string GetScalesPath() const { return mWorkspaceScalesPath.empty() ? mBatteryScalesPath : mWorkspaceScalesPath; }
64 std::string GetDefinitionsPath() const { return mWorkspaceDefinitionsPath.empty() ? mBatteryDefinitionsPath : mWorkspaceDefinitionsPath; }
65
66 // Check if scale exists
67 bool ScaleExists(const std::string& code) const;
68
69 // Get scale metadata (without loading full scale)
71 std::string code;
72 std::string name;
73 std::string description;
74 std::string author;
76 std::vector<std::string> availableLanguages;
77 };
78 ScaleMetadata GetScaleMetadata(const std::string& code) const;
79
80 // Create standalone study from scale in workspace
81 bool CreateStudyFromScale(std::shared_ptr<ScaleDefinition> scale,
82 const std::string& workspaceStudiesPath,
83 const std::string& studyName = "");
84
85 // Add scale as a test to an existing study
86 bool AddScaleToStudy(std::shared_ptr<ScaleDefinition> scale,
87 const std::string& studyPath);
88
89private:
90 void EnsureDirectoriesExist();
91 std::vector<std::string> GetTranslationFiles(const std::string& code) const;
92 std::vector<std::string> GetTranslationFilesFromPath(const std::string& code, const std::string& translationsPath) const;
93 bool ScaleExistsInPath(const std::string& code, const std::string& definitionsPath) const;
94
95 // Generate or copy screenshot for deployed scale test
96 bool GenerateScreenshot(const std::string& scaleCode, const std::string& testPath);
97
98 // Generate .pbl.schema.json and .pbl.par.json from scale definition parameters.
99 // Called at study/test creation time so OSD-defined params are immediately visible
100 // in the parameter editor. Also updates par.json with any new defaults without
101 // overwriting values the user has already set.
102 bool GenerateSchemaFiles(const ScaleDefinition& scale, const std::string& testPath);
103
104 std::string mBatteryPath;
105 std::string mWorkspacePath;
106
107 // Library paths (read-only, shipped with PEBL): media/apps/scales/
108 std::string mBatteryScalesPath; // media/apps/scales/
109 std::string mBatteryDefinitionsPath; // media/apps/scales/definitions/
110
111 // Workspace paths (writable, user-created)
112 std::string mWorkspaceScalesPath; // workspace/scales/
113 std::string mWorkspaceDefinitionsPath; // workspace/scales/definitions/
114};
115
116#endif // SCALE_MANAGER_H
std::string GetWorkspaceScalesPath() const
std::string GetWorkspacePath() const
bool ExportToBattery(std::shared_ptr< ScaleDefinition > scale)
bool ScaleExists(const std::string &code) const
std::vector< std::string > GetAvailableScales()
bool AddScaleToStudy(std::shared_ptr< ScaleDefinition > scale, const std::string &studyPath)
bool CreateStudyFromScale(std::shared_ptr< ScaleDefinition > scale, const std::string &workspaceStudiesPath, const std::string &studyName="")
std::string GetDefinitionPath(const std::string &code) const
std::string GetBatteryScalesPath() const
bool SaveScale(std::shared_ptr< ScaleDefinition > scale)
std::string GetScalesPath() const
std::vector< LooseOSDEntry > GetLooseOSDEntries() const
bool DeleteScale(const std::string &code)
std::shared_ptr< ScaleDefinition > ImportFromFile(const std::string &filePath)
std::string GetOSDPath(const std::string &code) const
ScaleMetadata GetScaleMetadata(const std::string &code) const
std::string GetTranslationPath(const std::string &code, const std::string &lang) const
std::string GetBatteryPath() const
std::shared_ptr< ScaleDefinition > CreateScale(const std::string &code)
std::string GetDefinitionsPath() const
std::shared_ptr< ScaleDefinition > InstallLooseOSD(const std::string &osdPath)
std::shared_ptr< ScaleDefinition > LoadScale(const std::string &code)
std::vector< std::string > availableLanguages