diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..1d59fff --- /dev/null +++ b/.clang-format @@ -0,0 +1,37 @@ +# .clang-format + +# Specify the formatting style. Here, we use LLVM style. +BasedOnStyle: LLVM + +# Set the column limit (maximum line width). +ColumnLimit: 120 + +# Indentation width (number of spaces for each level of indentation). +TabWidth: 4 +IndentWidth: 4 +IndentAccessModifiers: false +AccessModifierOffset: -4 + +# Whether to use spaces or tabs for indentation. +UseTab: Never + +BreakBeforeBraces: Allman + +AllowShortFunctionsOnASingleLine: None + +AllowShortIfStatementsOnASingleLine: false + +NamespaceIndentation: All + +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeComma + +FixNamespaceComments: false + +PointerAlignment: Right + +Cpp11BracedListStyle: false + +AlignArrayOfStructures: Left + +SortIncludes: Never diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..cc27ecf --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,99 @@ +Checks: >- + -* + ,bugprone-* + ,-bugprone-suspicious-include + ,cert-dcl21-cpp + ,cert-dcl58-cpp + ,cert-err34-c + ,cert-err52-cpp + ,cert-err60-cpp + ,cert-flp30-c + ,cert-msc50-cpp + ,cert-msc51-cpp + ,cert-str34-c + ,clang-analyzer-* + ,cppcoreguidelines-interfaces-global-init + ,cppcoreguidelines-narrowing-conversions + ,cppcoreguidelines-pro-type-member-init + ,cppcoreguidelines-pro-type-static-cast-downcast + ,cppcoreguidelines-slicing + ,google-default-arguments + ,google-explicit-constructor + ,google-runtime-operator + ,hicpp-exception-baseclass + ,hicpp-multiway-paths-covered + ,misc-misplaced-const + ,misc-new-delete-overloads + ,misc-no-recursion + ,misc-non-copyable-objects + ,misc-throw-by-value-catch-by-reference + ,misc-unconventional-assign-operator + ,misc-uniqueptr-reset-release + ,modernize-avoid-bind + ,modernize-concat-nested-namespaces + ,modernize-deprecated-headers + ,modernize-deprecated-ios-base-aliases + ,modernize-loop-convert + ,modernize-make-shared + ,modernize-make-unique + ,modernize-pass-by-value + ,modernize-raw-string-literal + ,modernize-redundant-void-arg + ,modernize-replace-auto-ptr + ,modernize-replace-disallow-copy-and-assign-macro + ,modernize-replace-random-shuffle + ,modernize-return-braced-init-list + ,modernize-shrink-to-fit + ,modernize-unary-static-assert + ,modernize-use-auto + ,modernize-use-bool-literals + ,modernize-use-emplace + ,modernize-use-equals-default + ,modernize-use-equals-delete + ,modernize-use-nodiscard + ,modernize-use-noexcept + ,modernize-use-nullptr + ,modernize-use-override + ,modernize-use-transparent-functors + ,modernize-use-uncaught-exceptions + ,mpi-buffer-deref + ,mpi-type-mismatch + ,openmp-use-default-none + ,performance-faster-string-find + ,performance-for-range-copy + ,performance-implicit-conversion-in-loop + ,performance-inefficient-algorithm + ,performance-inefficient-string-concatenation + ,performance-inefficient-vector-operation + ,performance-move-const-arg + ,performance-move-constructor-init + ,performance-no-automatic-move + ,performance-noexcept-move-constructor + ,performance-trivially-destructible + ,performance-type-promotion-in-math-fn + ,performance-unnecessary-copy-initialization + ,performance-unnecessary-value-param + ,readability-avoid-const-params-in-decls + ,readability-const-return-type + ,readability-container-size-empty + ,readability-convert-member-functions-to-static + ,readability-delete-null-pointer + ,readability-deleted-default + ,readability-inconsistent-declaration-parameter-name + ,readability-make-member-function-const + ,readability-misleading-indentation + ,readability-misplaced-array-index + ,readability-non-const-parameter + ,readability-redundant-control-flow + ,readability-redundant-declaration + ,readability-redundant-function-ptr-dereference + ,readability-redundant-smartptr-get + ,readability-redundant-string-cstr + ,readability-redundant-string-init + ,readability-simplify-subscript-expr + ,readability-static-accessed-through-instance + ,readability-static-definition-in-anonymous-namespace + ,readability-string-compare + ,readability-uniqueptr-delete-release + ,readability-use-anyofallof + diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d8bb88..b55f663 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,5 @@ cmake_minimum_required(VERSION 3.24) -# TODO figure this out -# https://stackoverflow.com/questions/47087237/cmake-and-ninja-rebuild-unnecessary-files -option(LINUX_REBUILD_WORKAROUND "ignore system headers for detecting dirty files" OFF) -if(LINUX_REBUILD_WORKAROUND) - file( - WRITE "${CMAKE_BINARY_DIR}/GNUMakeRulesOverwrite.cmake" - "STRING(REPLACE \"-MD\" \"-MMD\" CMAKE_DEPFILE_FLAGS_C \"\${CMAKE_DEPFILE_FLAGS_C}\")\n" - "STRING(REPLACE \"-MD\" \"-MMD\" CMAKE_DEPFILE_FLAGS_CXX \"\${CMAKE_DEPFILE_FLAGS_CXX}\")\n" - ) - set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_BINARY_DIR}/GNUMakeRulesOverwrite.cmake" CACHE INTERNAL "") -endif() - project(VainDirectoryModel VERSION 0.0.1) set(CMAKE_CXX_STANDARD 20) diff --git a/Demo/DirectoryModelDemo/DirectoryModelDemoComponent.cpp b/Demo/DirectoryModelDemo/DirectoryModelDemoComponent.cpp index 3af8a54..e8be63c 100644 --- a/Demo/DirectoryModelDemo/DirectoryModelDemoComponent.cpp +++ b/Demo/DirectoryModelDemo/DirectoryModelDemoComponent.cpp @@ -43,7 +43,8 @@ DirectoryModelDemoComponent::DirectoryModelDemoComponent() m_pathSelectionToggle.setButtonText("path selection"); m_pathSelectionToggle.onStateChange = [this]() { - m_selectionModel.setSelectionMode(m_pathSelectionToggle.getToggleState() ? vdm::PathSelectionHandler::Mode : vdm::SingleSelectionHandler::Mode ); + m_selectionModel.setSelectionMode(m_pathSelectionToggle.getToggleState() ? vdm::PathSelectionHandler::Mode + : vdm::SingleSelectionHandler::Mode); }; getLookAndFeel().setColour(juce::ToggleButton::ColourIds::textColourId, juce::Colours::black); @@ -59,21 +60,22 @@ DirectoryModelDemoComponent::DirectoryModelDemoComponent() switch (m_treeViewTypeCbx.getSelectedId()) { case 1: - { - auto ptr = std::make_unique(); - ptr->setValueTree(m_dirModel.getValueTree()); - m_treeView = std::move(ptr); - break; - } + { + auto ptr = std::make_unique(); + ptr->setValueTree(m_dirModel.getValueTree()); + m_treeView = std::move(ptr); + break; + } case 2: - { - auto ptr = std::make_unique(); - ptr->setValueTree(m_dirModel.getValueTree()); - ptr->setSelectionValueTree(m_dirModel.getValueTree()); - m_treeView = std::move(ptr); - break; - } - default: jassertfalse; + { + auto ptr = std::make_unique(); + ptr->setValueTree(m_dirModel.getValueTree()); + ptr->setSelectionValueTree(m_dirModel.getValueTree()); + m_treeView = std::move(ptr); + break; + } + default: + jassertfalse; } addAndMakeVisible(*m_treeView); @@ -109,7 +111,7 @@ void DirectoryModelDemoComponent::resized() //-------------------------------------------------------------------------------- -void DirectoryModelDemoComponent::modifierKeysChanged(const juce::ModifierKeys& modifiers) +void DirectoryModelDemoComponent::modifierKeysChanged(const juce::ModifierKeys &modifiers) { if (m_pathSelectionToggle.getToggleState()) return; diff --git a/Demo/DirectoryModelDemo/DirectoryModelDemoComponent.h b/Demo/DirectoryModelDemo/DirectoryModelDemoComponent.h index 3155664..4f8ba27 100644 --- a/Demo/DirectoryModelDemo/DirectoryModelDemoComponent.h +++ b/Demo/DirectoryModelDemo/DirectoryModelDemoComponent.h @@ -17,7 +17,7 @@ class DirectoryModelDemoComponent : public juce::Component ~DirectoryModelDemoComponent() override; void resized() override; - void modifierKeysChanged(const juce::ModifierKeys& modifiers) override; + void modifierKeysChanged(const juce::ModifierKeys &modifiers) override; private: vdm::NameUpdateHandler m_nameUpdateHandler; diff --git a/Demo/DirectoryModelDemo/JuceTreeView/DirectoryModelDemoJuceTreeViewItemComponent.cpp b/Demo/DirectoryModelDemo/JuceTreeView/DirectoryModelDemoJuceTreeViewItemComponent.cpp index cafc81e..6df09dc 100644 --- a/Demo/DirectoryModelDemo/JuceTreeView/DirectoryModelDemoJuceTreeViewItemComponent.cpp +++ b/Demo/DirectoryModelDemo/JuceTreeView/DirectoryModelDemoJuceTreeViewItemComponent.cpp @@ -24,7 +24,7 @@ DirectoryModelDemoJuceTreeViewItemComponent::~DirectoryModelDemoJuceTreeViewItem //-------------------------------------------------------------------------------- -void DirectoryModelDemoJuceTreeViewItemComponent::paint(juce::Graphics& g) +void DirectoryModelDemoJuceTreeViewItemComponent::paint(juce::Graphics &g) { const auto b{ getLocalBounds() }; @@ -38,7 +38,7 @@ void DirectoryModelDemoJuceTreeViewItemComponent::paint(juce::Graphics& g) //-------------------------------------------------------------------------------- -void DirectoryModelDemoJuceTreeViewItemComponent::mouseUp(const juce::MouseEvent& event) +void DirectoryModelDemoJuceTreeViewItemComponent::mouseUp(const juce::MouseEvent &event) { if (!event.mods.isLeftButtonDown()) return; @@ -49,7 +49,7 @@ void DirectoryModelDemoJuceTreeViewItemComponent::mouseUp(const juce::MouseEvent //-------------------------------------------------------------------------------- -void DirectoryModelDemoJuceTreeViewItemComponent::mouseDoubleClick(const juce::MouseEvent& event) +void DirectoryModelDemoJuceTreeViewItemComponent::mouseDoubleClick(const juce::MouseEvent &event) { using vdm = vdm::DirectoryModel; if (event.mods.isLeftButtonDown() && vdm::IsDir(m_tree)) @@ -74,21 +74,20 @@ void DirectoryModelDemoJuceTreeViewItemComponent::onItemIsDirOpenChanged(bool is //-------------------------------------------------------------------------------- -void DirectoryModelDemoJuceTreeViewItemComponent::valueTreePropertyChanged(juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property) +void DirectoryModelDemoJuceTreeViewItemComponent::valueTreePropertyChanged(juce::ValueTree &treeWhosePropertyHasChanged, + const juce::Identifier &property) { if (treeWhosePropertyHasChanged != m_tree) return; if (property == vdm::FileSizeUpdateHandler::Key) { - constexpr std::array sizes - {{ - "B", - "kB", - "mB", - "gB", - "tB", - }}; + constexpr std::array sizes{ + { + "B", "kB", + "mB", "gB", + "tB", } + }; const float bytes{ m_tree.getProperty(vdm::FileSizeUpdateHandler::Key) }; for (int i = sizes.size() - 1; i >= 0; i--) @@ -97,7 +96,8 @@ void DirectoryModelDemoJuceTreeViewItemComponent::valueTreePropertyChanged(juce: if (value <= bytes) { const float fileSize{ bytes / value }; - m_sizeString = juce::String(fileSize, juce::exactlyEqual(fileSize, std::floor(fileSize)) ? 0 : 2) + sizes[static_cast(i)]; + m_sizeString = juce::String(fileSize, juce::exactlyEqual(fileSize, std::floor(fileSize)) ? 0 : 2) + + sizes[static_cast(i)]; break; } } diff --git a/Demo/DirectoryModelDemo/JuceTreeView/DirectoryModelDemoJuceTreeViewItemComponent.h b/Demo/DirectoryModelDemo/JuceTreeView/DirectoryModelDemoJuceTreeViewItemComponent.h index 6a4ce03..928e3a4 100644 --- a/Demo/DirectoryModelDemo/JuceTreeView/DirectoryModelDemoJuceTreeViewItemComponent.h +++ b/Demo/DirectoryModelDemo/JuceTreeView/DirectoryModelDemoJuceTreeViewItemComponent.h @@ -17,16 +17,17 @@ class DirectoryModelDemoJuceTreeViewItemComponent explicit DirectoryModelDemoJuceTreeViewItemComponent(juce::ValueTree tree); ~DirectoryModelDemoJuceTreeViewItemComponent() override; - void paint(juce::Graphics& g) override; + void paint(juce::Graphics &g) override; - void mouseUp(const juce::MouseEvent& event) override; - void mouseDoubleClick(const juce::MouseEvent& event) override; + void mouseUp(const juce::MouseEvent &event) override; + void mouseDoubleClick(const juce::MouseEvent &event) override; void onItemSelectedChanged(bool isSelected) override; void onItemIsDirOpenChanged(bool isDirOpen) override; private: - void valueTreePropertyChanged(juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property) override; + void valueTreePropertyChanged(juce::ValueTree &treeWhosePropertyHasChanged, + const juce::Identifier &property) override; juce::ValueTree m_tree; juce::String m_sizeString; diff --git a/Demo/DirectoryModelDemo/SelectionViewer.cpp b/Demo/DirectoryModelDemo/SelectionViewer.cpp index f8f1ba9..295b06f 100644 --- a/Demo/DirectoryModelDemo/SelectionViewer.cpp +++ b/Demo/DirectoryModelDemo/SelectionViewer.cpp @@ -6,7 +6,7 @@ SelectionViewer::~SelectionViewer() = default; //-------------------------------------------------------------------------------- -void SelectionViewer::onSelectedTreeChanged(juce::ValueTree tree) +void SelectionViewer::onTreeSelectionChanged(juce::ValueTree tree) { if (vdm::SelectionModel::IsSelected(tree)) m_selectedTrees.insert(m_selectedTrees.begin(), tree); @@ -22,7 +22,7 @@ void SelectionViewer::onSelectedTreeChanged(juce::ValueTree tree) //-------------------------------------------------------------------------------- -void SelectionViewer::paint(juce::Graphics& g) +void SelectionViewer::paint(juce::Graphics &g) { auto b{ getLocalBounds() }; diff --git a/Demo/DirectoryModelDemo/SelectionViewer.h b/Demo/DirectoryModelDemo/SelectionViewer.h index ec829fd..e750afa 100644 --- a/Demo/DirectoryModelDemo/SelectionViewer.h +++ b/Demo/DirectoryModelDemo/SelectionViewer.h @@ -14,10 +14,10 @@ class SelectionViewer public: ~SelectionViewer() override; - void paint(juce::Graphics& g) override; + void paint(juce::Graphics &g) override; private: - void onSelectedTreeChanged(juce::ValueTree tree) override; + void onTreeSelectionChanged(juce::ValueTree tree) override; std::vector m_selectedTrees; }; diff --git a/Demo/DirectoryModelDemo/TreeView/DirectoryModelDemoTreeViewItem.cpp b/Demo/DirectoryModelDemo/TreeView/DirectoryModelDemoTreeViewItem.cpp index 0294108..2bdba64 100644 --- a/Demo/DirectoryModelDemo/TreeView/DirectoryModelDemoTreeViewItem.cpp +++ b/Demo/DirectoryModelDemo/TreeView/DirectoryModelDemoTreeViewItem.cpp @@ -24,7 +24,7 @@ DirectoryModelDemoTreeViewItem::~DirectoryModelDemoTreeViewItem() //-------------------------------------------------------------------------------- -void DirectoryModelDemoTreeViewItem::paint(juce::Graphics& g) +void DirectoryModelDemoTreeViewItem::paint(juce::Graphics &g) { auto b{ getLocalBounds() }; @@ -47,7 +47,8 @@ void DirectoryModelDemoTreeViewItem::paint(juce::Graphics& g) { juce::Graphics::ScopedSaveState state{ g }; if (!vdm::DirectoryModel::IsDirOpen(m_tree)) - g.addTransform(juce::AffineTransform::rotation(-juce::MathConstants::halfPi, ab.getCentreX(), ab.getCentreY())); + g.addTransform( + juce::AffineTransform::rotation(-juce::MathConstants::halfPi, ab.getCentreX(), ab.getCentreY())); constexpr float delta{ 7.0f }; ab.reduce(delta, delta); @@ -68,12 +69,13 @@ void DirectoryModelDemoTreeViewItem::paint(juce::Graphics& g) //-------------------------------------------------------------------------------- -void DirectoryModelDemoTreeViewItem::mouseUp(const juce::MouseEvent& event) +void DirectoryModelDemoTreeViewItem::mouseUp(const juce::MouseEvent &event) { if (!event.mods.isLeftButtonDown()) return; - if (vdm::DirectoryModel::IsDir(m_tree) && getLocalBounds().removeFromLeft(getHeight()).toFloat().contains(event.position)) + if (vdm::DirectoryModel::IsDir(m_tree) && + getLocalBounds().removeFromLeft(getHeight()).toFloat().contains(event.position)) vdm::DirectoryModel::ToggleIsDirOpen(m_tree); else vdm::SelectionModel::RequestSelectTree(m_tree); @@ -81,7 +83,7 @@ void DirectoryModelDemoTreeViewItem::mouseUp(const juce::MouseEvent& event) //-------------------------------------------------------------------------------- -void DirectoryModelDemoTreeViewItem::mouseEnter(const juce::MouseEvent& event) +void DirectoryModelDemoTreeViewItem::mouseEnter(const juce::MouseEvent &event) { juce::ignoreUnused(event); repaint(); @@ -89,7 +91,7 @@ void DirectoryModelDemoTreeViewItem::mouseEnter(const juce::MouseEvent& event) //-------------------------------------------------------------------------------- -void DirectoryModelDemoTreeViewItem::mouseExit(const juce::MouseEvent& event) +void DirectoryModelDemoTreeViewItem::mouseExit(const juce::MouseEvent &event) { juce::ignoreUnused(event); repaint(); @@ -97,7 +99,7 @@ void DirectoryModelDemoTreeViewItem::mouseExit(const juce::MouseEvent& event) //-------------------------------------------------------------------------------- -void DirectoryModelDemoTreeViewItem::mouseDoubleClick(const juce::MouseEvent& event) +void DirectoryModelDemoTreeViewItem::mouseDoubleClick(const juce::MouseEvent &event) { using vdm = vdm::DirectoryModel; if (event.mods.isLeftButtonDown() && vdm::IsDir(m_tree)) @@ -122,21 +124,20 @@ void DirectoryModelDemoTreeViewItem::onItemIsDirOpenChanged(bool isDirOpen) //-------------------------------------------------------------------------------- -void DirectoryModelDemoTreeViewItem::valueTreePropertyChanged(juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property) +void DirectoryModelDemoTreeViewItem::valueTreePropertyChanged(juce::ValueTree &treeWhosePropertyHasChanged, + const juce::Identifier &property) { if (treeWhosePropertyHasChanged != m_tree) return; if (property == vdm::FileSizeUpdateHandler::Key) { - constexpr std::array sizes - {{ - "B", - "kB", - "mB", - "gB", - "tB", - }}; + constexpr std::array sizes{ + { + "B", "kB", + "mB", "gB", + "tB", } + }; const float bytes{ m_tree.getProperty(vdm::FileSizeUpdateHandler::Key) }; for (int i = sizes.size() - 1; i >= 0; i--) @@ -145,7 +146,8 @@ void DirectoryModelDemoTreeViewItem::valueTreePropertyChanged(juce::ValueTree& t if (value <= bytes) { const float fileSize{ bytes / value }; - m_sizeString = juce::String(fileSize, juce::exactlyEqual(fileSize, std::floor(fileSize)) ? 0 : 2) + sizes[static_cast(i)]; + m_sizeString = juce::String(fileSize, juce::exactlyEqual(fileSize, std::floor(fileSize)) ? 0 : 2) + + sizes[static_cast(i)]; break; } } diff --git a/Demo/DirectoryModelDemo/TreeView/DirectoryModelDemoTreeViewItem.h b/Demo/DirectoryModelDemo/TreeView/DirectoryModelDemoTreeViewItem.h index 1bb771f..0266a99 100644 --- a/Demo/DirectoryModelDemo/TreeView/DirectoryModelDemoTreeViewItem.h +++ b/Demo/DirectoryModelDemo/TreeView/DirectoryModelDemoTreeViewItem.h @@ -19,12 +19,12 @@ class DirectoryModelDemoTreeViewItem explicit DirectoryModelDemoTreeViewItem(juce::ValueTree tree); ~DirectoryModelDemoTreeViewItem() override; - void paint(juce::Graphics& g) override; + void paint(juce::Graphics &g) override; - void mouseUp(const juce::MouseEvent& event) override; - void mouseEnter(const juce::MouseEvent& event) override; - void mouseExit(const juce::MouseEvent& event) override; - void mouseDoubleClick(const juce::MouseEvent& event) override; + void mouseUp(const juce::MouseEvent &event) override; + void mouseEnter(const juce::MouseEvent &event) override; + void mouseExit(const juce::MouseEvent &event) override; + void mouseDoubleClick(const juce::MouseEvent &event) override; private: // vdm::TreeViewItem @@ -32,7 +32,8 @@ class DirectoryModelDemoTreeViewItem void onItemIsDirOpenChanged(bool isDirOpen) override; // juce::ValueTree::Listener - void valueTreePropertyChanged(juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property) override; + void valueTreePropertyChanged(juce::ValueTree &treeWhosePropertyHasChanged, + const juce::Identifier &property) override; juce::ValueTree m_tree; bool m_isSelected{ false }; diff --git a/Demo/Main.cpp b/Demo/Main.cpp index 17bca97..291e6ae 100644 --- a/Demo/Main.cpp +++ b/Demo/Main.cpp @@ -3,18 +3,29 @@ //-------------------------------------------------------------------------------- -class DemoApplication : public juce::JUCEApplication +class DemoApplication : public juce::JUCEApplication { public: - DemoApplication() {} + DemoApplication() + { + } - const juce::String getApplicationName() override { return "Demo"; } - const juce::String getApplicationVersion() override { return "1.0"; } - bool moreThanOneInstanceAllowed() override { return true; } + const juce::String getApplicationName() override + { + return "Demo"; + } + const juce::String getApplicationVersion() override + { + return "1.0"; + } + bool moreThanOneInstanceAllowed() override + { + return true; + } - void initialise (const juce::String& ) override + void initialise(const juce::String &) override { - mainWindow.reset (new MainWindow (getApplicationName())); + mainWindow.reset(new MainWindow(getApplicationName())); } void shutdown() override @@ -27,22 +38,24 @@ class DemoApplication : public juce::JUCEApplication quit(); } - void anotherInstanceStarted (const juce::String&) override {} + void anotherInstanceStarted(const juce::String &) override + { + } class MainWindow : public juce::DocumentWindow { public: - MainWindow (juce::String name) - : DocumentWindow (name, - juce::Desktop::getInstance().getDefaultLookAndFeel() - .findColour (juce::ResizableWindow::backgroundColourId), - DocumentWindow::allButtons) + MainWindow(juce::String name) + : DocumentWindow(name, + juce::Desktop::getInstance().getDefaultLookAndFeel().findColour( + juce::ResizableWindow::backgroundColourId), + DocumentWindow::allButtons) { - setUsingNativeTitleBar (true); - setContentOwned (new MainComponent(), true); - setResizable (true, false); - centreWithSize (getWidth(), getHeight()); - setVisible (true); + setUsingNativeTitleBar(true); + setContentOwned(new MainComponent(), true); + setResizable(true, false); + centreWithSize(getWidth(), getHeight()); + juce::Component::setVisible(true); } void closeButtonPressed() override @@ -51,7 +64,7 @@ class DemoApplication : public juce::JUCEApplication } private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow) + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MainWindow) }; private: diff --git a/Demo/MainComponent.cpp b/Demo/MainComponent.cpp index 8133533..3ea33fb 100644 --- a/Demo/MainComponent.cpp +++ b/Demo/MainComponent.cpp @@ -19,7 +19,7 @@ MainComponent::~MainComponent() = default; //-------------------------------------------------------------------------------- -void MainComponent::paint(juce::Graphics& g) +void MainComponent::paint(juce::Graphics &g) { g.fillAll(juce::Colours::lightgrey); } diff --git a/Demo/MainComponent.h b/Demo/MainComponent.h index 716b2d2..1cf0a80 100644 --- a/Demo/MainComponent.h +++ b/Demo/MainComponent.h @@ -13,7 +13,7 @@ class MainComponent : public juce::Component MainComponent(); ~MainComponent() override; - void paint(juce::Graphics&) override; + void paint(juce::Graphics &) override; void resized() override; private: diff --git a/Modules/CMakeLists.txt b/Modules/CMakeLists.txt index e348202..98ff2e5 100644 --- a/Modules/CMakeLists.txt +++ b/Modules/CMakeLists.txt @@ -4,7 +4,7 @@ option(BUILD_SHARED_LIBS "Build efsw as a shared library" OFF) FetchContent_Declare( efsw GIT_REPOSITORY "https://github.com/SpartanJ/efsw.git" - GIT_TAG "f94a661" # TODO update? + GIT_TAG "347397c" SOURCE_DIR "${CMAKE_BINARY_DIR}/efsw" BINARY_DIR "${CMAKE_BINARY_DIR}/efsw_build" ) diff --git a/Modules/vdm_directory/Cursor/vdm_TreeViewCursor.cpp b/Modules/vdm_directory/Cursor/vdm_TreeViewCursor.cpp index ecacef2..af1a678 100644 --- a/Modules/vdm_directory/Cursor/vdm_TreeViewCursor.cpp +++ b/Modules/vdm_directory/Cursor/vdm_TreeViewCursor.cpp @@ -22,7 +22,9 @@ bool vdm::TreeViewCursor::keyUp() { if (m_cursor.child()) { - while (m_cursor.next()) {} + while (m_cursor.next()) + { + } } else { @@ -48,10 +50,14 @@ bool vdm::TreeViewCursor::keyDown() m_cursor.next(); } } - else if (m_cursor.next()) {} + else if (m_cursor.next()) + { + } else { - while (m_cursor.parent() && !m_cursor.next()) {} + while (m_cursor.parent() && !m_cursor.next()) + { + } } return true; diff --git a/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModel.cpp b/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModel.cpp index caf4805..da83503 100644 --- a/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModel.cpp +++ b/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModel.cpp @@ -42,7 +42,7 @@ vdm::DirectoryModel::~DirectoryModel() = default; //----------------------------------------------------------------------------- -void vdm::DirectoryModel::initialize(const juce::File& root, bool populate) +void vdm::DirectoryModel::initialize(const juce::File &root, bool populate) { if (!m_tree.isInitialized()) { @@ -56,7 +56,7 @@ void vdm::DirectoryModel::initialize(const juce::File& root, bool populate) //----------------------------------------------------------------------------- -void vdm::DirectoryModel::initialize(const juce::File& root, const juce::FileFilter* fileFilter) +void vdm::DirectoryModel::initialize(const juce::File &root, const juce::FileFilter *fileFilter) { initialize(root, false); populateTree(fileFilter); @@ -78,7 +78,7 @@ juce::File vdm::DirectoryModel::getRootFile() const //----------------------------------------------------------------------------- -void vdm::DirectoryModel::addUpdateHandler(IUpdateHandler& updateHandler) +void vdm::DirectoryModel::addUpdateHandler(IUpdateHandler &updateHandler) { m_updateHandlers.push_back(&updateHandler); } @@ -127,11 +127,12 @@ void vdm::DirectoryModel::handleModifyUpdate(juce::ValueTree tree, juce::File fi //----------------------------------------------------------------------------- -void vdm::DirectoryModel::populateTree(const juce::FileFilter* filter) +void vdm::DirectoryModel::populateTree(const juce::FileFilter *filter) { handleAddUpdate(m_tree.getRootValueTree(), m_tree.getRootFile()); - const auto childFiles = m_tree.getRootFile().findChildFiles(juce::File::TypesOfFileToFind::findFilesAndDirectories, true); + const auto childFiles = + m_tree.getRootFile().findChildFiles(juce::File::TypesOfFileToFind::findFilesAndDirectories, true); for (const auto &child : childFiles) { auto path = child.getFullPathName().toStdString(); diff --git a/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModel.h b/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModel.h index e9d995c..d6aed19 100644 --- a/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModel.h +++ b/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModel.h @@ -47,6 +47,7 @@ class DirectoryModel Dir = 1, File = 2 }; + static const inline juce::Identifier TypeKey{ "file_type" }; static const inline juce::Identifier DirOpenKey{ "dir_open" }; diff --git a/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModelSync.cpp b/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModelSync.cpp index 9dd5cbd..f5144bb 100644 --- a/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModelSync.cpp +++ b/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModelSync.cpp @@ -15,7 +15,7 @@ vdm::DirectoryModelSync::~DirectoryModelSync() //----------------------------------------------------------------------------- -void vdm::DirectoryModelSync::syncModel(DirectoryModel& model, const juce::FileFilter* fileFilter) +void vdm::DirectoryModelSync::syncModel(DirectoryModel &model, const juce::FileFilter *fileFilter) { if (auto it{ findModel(model) }; it == m_models.end()) { @@ -29,7 +29,7 @@ void vdm::DirectoryModelSync::syncModel(DirectoryModel& model, const juce::FileF //----------------------------------------------------------------------------- -void vdm::DirectoryModelSync::unsyncModel(DirectoryModel& model) +void vdm::DirectoryModelSync::unsyncModel(DirectoryModel &model) { if (const auto it{ findModel(model) }; it != m_models.end()) { @@ -42,21 +42,23 @@ void vdm::DirectoryModelSync::unsyncModel(DirectoryModel& model) //----------------------------------------------------------------------------- -bool vdm::DirectoryModelSync::isModelSynced(DirectoryModel& model) +bool vdm::DirectoryModelSync::isModelSynced(DirectoryModel &model) { return findModel(model) != m_models.end(); } //----------------------------------------------------------------------------- -void vdm::DirectoryModelSync::handleFileAction(efsw::WatchID watchid, const std::string& dir, const std::string& filename, efsw::Action action, std::string oldFilename) +void vdm::DirectoryModelSync::handleFileAction(efsw::WatchID watchid, const std::string &dir, + const std::string &filename, efsw::Action action, + const std::string &oldFilename) { if (const auto it{ m_models.find(watchid) }; it != m_models.end()) { juce::File f{ dir + filename }; const auto root{ it->second.model->getRootFile() }; - if(f != root && !f.isAChildOf(root)) + if (f != root && !f.isAChildOf(root)) { // TODO receiving events here for the parent to root - shouldnt be? // jassertfalse; @@ -77,7 +79,9 @@ void vdm::DirectoryModelSync::handleFileAction(efsw::WatchID watchid, const std: //----------------------------------------------------------------------------- -void vdm::DirectoryModelSync::messageThreadHandleFileAction(efsw::WatchID watchid, const std::string& dir, const std::string& filename, efsw::Action action, std::string oldFilename) +void vdm::DirectoryModelSync::messageThreadHandleFileAction(efsw::WatchID watchid, const std::string &dir, + const std::string &filename, efsw::Action action, + std::string oldFilename) { juce::ignoreUnused(watchid, oldFilename); jassert(juce::MessageManager::existsAndIsCurrentThread()); @@ -106,20 +110,20 @@ void vdm::DirectoryModelSync::messageThreadHandleFileAction(efsw::WatchID watchi switch (action) { case efsw::Action::Add: - { - model->addFile(file); - break; - } + { + model->addFile(file); + break; + } case efsw::Action::Delete: - { - model->removeFile(file); - break; - } + { + model->removeFile(file); + break; + } case efsw::Action::Modified: - { - model->updateFile(file); - break; - } + { + model->updateFile(file); + break; + } case efsw::Action::Moved: messageThreadHandleFileAction(watchid, dir, oldFilename, efsw::Action::Delete, {}); messageThreadHandleFileAction(watchid, dir, filename, efsw::Action::Add, {}); @@ -131,9 +135,10 @@ void vdm::DirectoryModelSync::messageThreadHandleFileAction(efsw::WatchID watchi //----------------------------------------------------------------------------- -std::map::iterator vdm::DirectoryModelSync::findModel(DirectoryModel& model) +std::map::iterator +vdm::DirectoryModelSync::findModel(DirectoryModel &model) { - return std::ranges::find_if(m_models,[&model](auto pair) { return pair.second.model == &model; }); + return std::ranges::find_if(m_models, [&model](auto pair) { return pair.second.model == &model; }); } //----------------------------------------------------------------------------- diff --git a/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModelSync.h b/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModelSync.h index fa994c6..8cefa38 100644 --- a/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModelSync.h +++ b/Modules/vdm_directory/DirectoryModel/vdm_DirectoryModelSync.h @@ -35,18 +35,20 @@ class DirectoryModelSync : private efsw::FileWatchListener DirectoryModelSync(); ~DirectoryModelSync() override; - void syncModel(DirectoryModel &model, const juce::FileFilter* fileFilter = nullptr); + void syncModel(DirectoryModel &model, const juce::FileFilter *fileFilter = nullptr); void unsyncModel(DirectoryModel &model); bool isModelSynced(DirectoryModel &model); private: - void handleFileAction(efsw::WatchID watchid, const std::string& dir, const std::string& filename, efsw::Action action, std::string oldFilename) override; - void messageThreadHandleFileAction(efsw::WatchID watchid, const std::string& dir, const std::string& filename, efsw::Action action, std::string oldFilename); + void handleFileAction(efsw::WatchID watchid, const std::string &dir, const std::string &filename, + efsw::Action action, const std::string& oldFilename) override; + void messageThreadHandleFileAction(efsw::WatchID watchid, const std::string &dir, const std::string &filename, + efsw::Action action, std::string oldFilename); struct Entry { DirectoryModel *model; - const juce::FileFilter* fileFilter; + const juce::FileFilter *fileFilter; }; using ModelMap = std::map; diff --git a/Modules/vdm_directory/DirectoryModel/vdm_DirectoryTree.cpp b/Modules/vdm_directory/DirectoryModel/vdm_DirectoryTree.cpp index ea4f927..afc538a 100644 --- a/Modules/vdm_directory/DirectoryModel/vdm_DirectoryTree.cpp +++ b/Modules/vdm_directory/DirectoryModel/vdm_DirectoryTree.cpp @@ -6,16 +6,16 @@ vdm::DirectoryTree::DirectoryTree() = default; //----------------------------------------------------------------------------- -vdm::DirectoryTree::DirectoryTree(const juce::File& root) +vdm::DirectoryTree::DirectoryTree(const juce::File &root) { initialize(root); } //----------------------------------------------------------------------------- -void vdm::DirectoryTree::initialize(const juce::File& root) +void vdm::DirectoryTree::initialize(const juce::File &root) { - jassert(!isInitialized()); // don't initialize twice + jassert(!isInitialized()); // don't initialize twice jassert(root.exists() && root.isDirectory()); // don't initialize with a nonexistent file m_root = root; @@ -45,21 +45,21 @@ juce::File vdm::DirectoryTree::getRootFile() const //----------------------------------------------------------------------------- -bool vdm::DirectoryTree::hasValueTreeAt(const juce::File& file) +bool vdm::DirectoryTree::hasValueTreeAt(const juce::File &file) { return internalGetValueTreeAt(file, false).isValid(); } //----------------------------------------------------------------------------- -juce::ValueTree vdm::DirectoryTree::getValueTreeAt(const juce::File& file) +juce::ValueTree vdm::DirectoryTree::getValueTreeAt(const juce::File &file) { return internalGetValueTreeAt(file, true); } //----------------------------------------------------------------------------- -void vdm::DirectoryTree::removeValueTreeAt(const juce::File& file) +void vdm::DirectoryTree::removeValueTreeAt(const juce::File &file) { const auto tree{ internalGetValueTreeAt(file, false) }; @@ -69,7 +69,7 @@ void vdm::DirectoryTree::removeValueTreeAt(const juce::File& file) //----------------------------------------------------------------------------- -std::stack vdm::DirectoryTree::pathToStack(const juce::File& f) const +std::stack vdm::DirectoryTree::pathToStack(const juce::File &f) const { std::stack stack; @@ -91,7 +91,7 @@ std::stack vdm::DirectoryTree::pathToStack(const juce::File& f) co //----------------------------------------------------------------------------- -juce::ValueTree vdm::DirectoryTree::internalGetValueTreeAt(const juce::File& file, bool create) +juce::ValueTree vdm::DirectoryTree::internalGetValueTreeAt(const juce::File &file, bool create) { if (!m_tree.isValid()) { diff --git a/Modules/vdm_directory/SelectionModel/vdm_SelectionHandlers.cpp b/Modules/vdm_directory/SelectionModel/vdm_SelectionHandlers.cpp index 1ba0129..0507f4f 100644 --- a/Modules/vdm_directory/SelectionModel/vdm_SelectionHandlers.cpp +++ b/Modules/vdm_directory/SelectionModel/vdm_SelectionHandlers.cpp @@ -8,7 +8,8 @@ vdm::SingleSelectionHandler::~SingleSelectionHandler() = default; //----------------------------------------------------------------------------- -void vdm::SingleSelectionHandler::selectTree(const std::span& previouslySelected, juce::ValueTree newSelection) +void vdm::SingleSelectionHandler::selectTree(const std::span &previouslySelected, + juce::ValueTree newSelection) { for (auto t : previouslySelected) t.setProperty(SelectionModel::IsSelectedKey, false, nullptr); @@ -22,7 +23,8 @@ vdm::PathSelectionHandler::~PathSelectionHandler() = default; //----------------------------------------------------------------------------- -void vdm::PathSelectionHandler::selectTree(const std::span& previouslySelected, juce::ValueTree newSelection) +void vdm::PathSelectionHandler::selectTree(const std::span &previouslySelected, + juce::ValueTree newSelection) { std::stack newPath; auto t = newSelection; @@ -53,8 +55,7 @@ vdm::GroupMultiSelectionHandler::~GroupMultiSelectionHandler() = default; //----------------------------------------------------------------------------- -template -juce::ValueTree FindFirst(juce::ValueTree root, const Fn &fn) +template juce::ValueTree FindFirst(juce::ValueTree root, const Fn &fn) { if (fn(root)) return root; @@ -71,7 +72,8 @@ juce::ValueTree FindFirst(juce::ValueTree root, const Fn &fn) //----------------------------------------------------------------------------- -void vdm::GroupMultiSelectionHandler::selectTree(const std::span& previouslySelected, juce::ValueTree newSelection) +void vdm::GroupMultiSelectionHandler::selectTree(const std::span &previouslySelected, + juce::ValueTree newSelection) { if (previouslySelected.empty()) { @@ -98,7 +100,7 @@ void vdm::GroupMultiSelectionHandler::selectTree(const std::span& previouslySelected, juce::ValueTree newSelection) +void vdm::IndividualMultiSelectionHandler::selectTree(const std::span &previouslySelected, + juce::ValueTree newSelection) { - const bool isAlreadySelected{ std::ranges::find_if(previouslySelected, [newSelection](auto t){ return t == newSelection; }) != previouslySelected.end() }; + const bool isAlreadySelected{ std::ranges::find_if(previouslySelected, [newSelection](auto t) + { return t == newSelection; }) != previouslySelected.end() }; newSelection.setProperty(SelectionModel::IsSelectedKey, !isAlreadySelected, nullptr); } diff --git a/Modules/vdm_directory/SelectionModel/vdm_SelectionHandlers.h b/Modules/vdm_directory/SelectionModel/vdm_SelectionHandlers.h index 8246b56..3d416de 100644 --- a/Modules/vdm_directory/SelectionModel/vdm_SelectionHandlers.h +++ b/Modules/vdm_directory/SelectionModel/vdm_SelectionHandlers.h @@ -21,7 +21,7 @@ class SingleSelectionHandler final : public SelectionModel::ISelectionHandler ~SingleSelectionHandler() override; - void selectTree(const std::span& previouslySelected, juce::ValueTree newSelection) override; + void selectTree(const std::span &previouslySelected, juce::ValueTree newSelection) override; }; //----------------------------------------------------------------------------- @@ -36,7 +36,7 @@ class PathSelectionHandler final : public SelectionModel::ISelectionHandler ~PathSelectionHandler() override; - void selectTree(const std::span& previouslySelected, juce::ValueTree newSelection) override; + void selectTree(const std::span &previouslySelected, juce::ValueTree newSelection) override; }; //----------------------------------------------------------------------------- @@ -51,7 +51,7 @@ class GroupMultiSelectionHandler final : public SelectionModel::ISelectionHandle ~GroupMultiSelectionHandler() override; - void selectTree(const std::span& previouslySelected, juce::ValueTree newSelection) override; + void selectTree(const std::span &previouslySelected, juce::ValueTree newSelection) override; }; //----------------------------------------------------------------------------- @@ -66,10 +66,9 @@ class IndividualMultiSelectionHandler final : public SelectionModel::ISelectionH ~IndividualMultiSelectionHandler() override; - void selectTree(const std::span& previouslySelected, juce::ValueTree newSelection) override; + void selectTree(const std::span &previouslySelected, juce::ValueTree newSelection) override; }; - END_VDM_NAMESPACE //----------------------------------------------------------------------------- diff --git a/Modules/vdm_directory/SelectionModel/vdm_SelectionModel.cpp b/Modules/vdm_directory/SelectionModel/vdm_SelectionModel.cpp index 50bc326..2b88338 100644 --- a/Modules/vdm_directory/SelectionModel/vdm_SelectionModel.cpp +++ b/Modules/vdm_directory/SelectionModel/vdm_SelectionModel.cpp @@ -23,7 +23,7 @@ void vdm::SelectionModel::RequestToggleSelection(juce::ValueTree tree) //----------------------------------------------------------------------------- -void vdm::SelectionModel::SetSelectionMode(juce::ValueTree tree, const juce::String& selectionMode) +void vdm::SelectionModel::SetSelectionMode(juce::ValueTree tree, const juce::String &selectionMode) { tree.setProperty(ModeKey, selectionMode, nullptr); } @@ -62,21 +62,22 @@ void vdm::SelectionModel::setValueTree(juce::ValueTree tree) //----------------------------------------------------------------------------- -void vdm::SelectionModel::addSelectionHandler(const juce::String& modeId, ISelectionHandler& handler) +void vdm::SelectionModel::addSelectionHandler(const juce::String &modeId, ISelectionHandler &handler) { m_selectionHandlers[modeId] = &handler; } //----------------------------------------------------------------------------- -void vdm::SelectionModel::setSelectionMode(const juce::String& modeId) +void vdm::SelectionModel::setSelectionMode(const juce::String &modeId) { SetSelectionMode(m_tree, modeId); } //----------------------------------------------------------------------------- -void vdm::SelectionModel::valueTreePropertyChanged(juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property) +void vdm::SelectionModel::valueTreePropertyChanged(juce::ValueTree &treeWhosePropertyHasChanged, + const juce::Identifier &property) { if (property == RequestSelectionKey && treeWhosePropertyHasChanged.hasProperty(RequestSelectionKey)) { @@ -95,11 +96,8 @@ void vdm::SelectionModel::valueTreePropertyChanged(juce::ValueTree& treeWhosePro m_currentlySelected.push_back(treeWhosePropertyHasChanged); else { - const auto it{ std::ranges::find_if(m_currentlySelected, - [treeWhosePropertyHasChanged](auto t) - { - return t == treeWhosePropertyHasChanged; - }) }; + const auto it{ std::ranges::find_if(m_currentlySelected, [treeWhosePropertyHasChanged](auto t) + { return t == treeWhosePropertyHasChanged; }) }; if (it != m_currentlySelected.end()) m_currentlySelected.erase(it); @@ -107,7 +105,8 @@ void vdm::SelectionModel::valueTreePropertyChanged(juce::ValueTree& treeWhosePro } if (property == ModeKey) { - if (const auto it = m_selectionHandlers.find(treeWhosePropertyHasChanged.getProperty(property)); it != m_selectionHandlers.end()) + if (const auto it = m_selectionHandlers.find(treeWhosePropertyHasChanged.getProperty(property)); + it != m_selectionHandlers.end()) m_activeSelectionHandler = it->second; else jassertfalse; diff --git a/Modules/vdm_directory/SelectionModel/vdm_SelectionModel.h b/Modules/vdm_directory/SelectionModel/vdm_SelectionModel.h index 5209be0..711a0aa 100644 --- a/Modules/vdm_directory/SelectionModel/vdm_SelectionModel.h +++ b/Modules/vdm_directory/SelectionModel/vdm_SelectionModel.h @@ -54,10 +54,11 @@ class SelectionModel : private juce::ValueTree::Listener juce::ValueTree getValueTree() const; void setValueTree(juce::ValueTree tree); - void addSelectionHandler(const juce::String& modeId, ISelectionHandler &handler); + void addSelectionHandler(const juce::String &modeId, ISelectionHandler &handler); void setSelectionMode(const juce::String &modeId); - void valueTreePropertyChanged(juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property) override; + void valueTreePropertyChanged(juce::ValueTree &treeWhosePropertyHasChanged, + const juce::Identifier &property) override; private: juce::ValueTree m_tree; diff --git a/Modules/vdm_directory/SelectionModel/vdm_SelectionModelListener.cpp b/Modules/vdm_directory/SelectionModel/vdm_SelectionModelListener.cpp index 0920f2d..205377f 100644 --- a/Modules/vdm_directory/SelectionModel/vdm_SelectionModelListener.cpp +++ b/Modules/vdm_directory/SelectionModel/vdm_SelectionModelListener.cpp @@ -7,7 +7,8 @@ class vdm::SelectionModelListener::Impl : public juce::ValueTree::Listener public: Impl(SelectionModelListener &l) : listener(l) - {} + { + } ~Impl() override { @@ -15,34 +16,36 @@ class vdm::SelectionModelListener::Impl : public juce::ValueTree::Listener tree.removeListener(this); } - void valueTreePropertyChanged(juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property) override + void valueTreePropertyChanged(juce::ValueTree &treeWhosePropertyHasChanged, + const juce::Identifier &property) override { if (property == SelectionModel::IsSelectedKey) { - listener.onSelectedTreeChanged(treeWhosePropertyHasChanged); + listener.onTreeSelectionChanged(treeWhosePropertyHasChanged); } } - template - static void traverseApply(juce::ValueTree tree, const Fn &fn) + template static void traverseApply(juce::ValueTree tree, const Fn &fn) { fn(tree); for (auto child : tree) traverseApply(child, fn); } - void valueTreeChildRemoved(juce::ValueTree& parentTree, juce::ValueTree& childWhichHasBeenRemoved, int indexFromWhichChildWasRemoved) override + void valueTreeChildRemoved(juce::ValueTree &parentTree, juce::ValueTree &childWhichHasBeenRemoved, + int indexFromWhichChildWasRemoved) override { juce::ignoreUnused(parentTree, indexFromWhichChildWasRemoved); - traverseApply(childWhichHasBeenRemoved, [this](juce::ValueTree t) - { - if (SelectionModel::IsSelected(t)) - { - t.setProperty(SelectionModel::IsSelectedKey, false, nullptr); - listener.onSelectedTreeChanged(t); - } - }); + traverseApply(childWhichHasBeenRemoved, + [this](juce::ValueTree t) + { + if (SelectionModel::IsSelected(t)) + { + t.setProperty(SelectionModel::IsSelectedKey, false, nullptr); + listener.onTreeSelectionChanged(t); + } + }); } void sendCallbacks() @@ -64,7 +67,8 @@ class vdm::SelectionModelListener::Impl : public juce::ValueTree::Listener vdm::SelectionModelListener::SelectionModelListener() : m_p(std::make_unique(*this)) -{} +{ +} //----------------------------------------------------------------------------- @@ -72,7 +76,7 @@ vdm::SelectionModelListener::~SelectionModelListener() = default; //----------------------------------------------------------------------------- -void vdm::SelectionModelListener::setSelectionModel(SelectionModel& model) +void vdm::SelectionModelListener::setSelectionModel(SelectionModel &model) { setSelectionModelValueTree(model.getValueTree()); } diff --git a/Modules/vdm_directory/SelectionModel/vdm_SelectionModelListener.h b/Modules/vdm_directory/SelectionModel/vdm_SelectionModelListener.h index dae12e8..a139f78 100644 --- a/Modules/vdm_directory/SelectionModel/vdm_SelectionModelListener.h +++ b/Modules/vdm_directory/SelectionModel/vdm_SelectionModelListener.h @@ -28,7 +28,7 @@ class SelectionModelListener void setSelectionModel(SelectionModel &model); void setSelectionModelValueTree(juce::ValueTree tree); - virtual void onSelectedTreeChanged(juce::ValueTree tree) = 0; + virtual void onTreeSelectionChanged(juce::ValueTree treeWithChangedSelectionState) = 0; private: class Impl; diff --git a/Modules/vdm_directory/SelectionModel/vdm_TreeViewSelector.cpp b/Modules/vdm_directory/SelectionModel/vdm_TreeViewSelector.cpp index 3b4e317..f6034ec 100644 --- a/Modules/vdm_directory/SelectionModel/vdm_TreeViewSelector.cpp +++ b/Modules/vdm_directory/SelectionModel/vdm_TreeViewSelector.cpp @@ -6,9 +6,11 @@ class vdm::TreeViewSelector::Impl : public vdm::SelectionModelListener { public: - ~Impl() override {} + ~Impl() override + { + } - void onSelectedTreeChanged(juce::ValueTree tree) override + void onTreeSelectionChanged(juce::ValueTree tree) override { if (SelectionModel::IsSelected(tree)) { @@ -78,8 +80,7 @@ void vdm::TreeViewSelector::keyRight() //----------------------------------------------------------------------------- -template -juce::ValueTree findFirst(juce::ValueTree root, Fn fn) +template juce::ValueTree findFirst(juce::ValueTree root, Fn fn) { if (fn(root)) return root; @@ -104,9 +105,10 @@ void vdm::TreeViewSelector::setValueTree(juce::ValueTree tree) if (t.isValid()) m_p->cursor.setValueTree(t); else + { m_p->cursor.setValueTree(tree); - - m_p->selectCurrent(); + m_p->selectCurrent(); + } } //----------------------------------------------------------------------------- diff --git a/Modules/vdm_directory/SelectionModel/vdm_TreeViewSelector.h b/Modules/vdm_directory/SelectionModel/vdm_TreeViewSelector.h index 752d679..07c5fb4 100644 --- a/Modules/vdm_directory/SelectionModel/vdm_TreeViewSelector.h +++ b/Modules/vdm_directory/SelectionModel/vdm_TreeViewSelector.h @@ -23,7 +23,7 @@ class TreeViewSelector { public: TreeViewSelector(); - TreeViewSelector(juce::ValueTree tree); + explicit TreeViewSelector(juce::ValueTree tree); ~TreeViewSelector(); void keyUp(); diff --git a/Modules/vdm_ui/TreeView/vdm_TreeView.cpp b/Modules/vdm_ui/TreeView/vdm_TreeView.cpp index 54161ad..3ec772d 100644 --- a/Modules/vdm_ui/TreeView/vdm_TreeView.cpp +++ b/Modules/vdm_ui/TreeView/vdm_TreeView.cpp @@ -5,12 +5,16 @@ void vdm::TreeView::setValueTree(juce::ValueTree tree) { - m_root.initialize(tree, [this](auto t) - { - auto ptr{ createTreeViewItem(t) }; - addAndMakeVisible(*ptr); - return std::move(ptr); - }); + m_root.initialize(tree, + [this](auto t) + { + auto ptr{ createTreeViewItem(t) }; + + if (ptr) + addAndMakeVisible(*ptr); + + return std::move(ptr); + }); m_root.tree.addListener(this); } @@ -56,7 +60,8 @@ void vdm::TreeView::resized() m_root.setBounds(b, m_subFolderIndentation, m_itemMargin, m_itemHeight); else { - m_root.component->setBounds({}); + if (m_root.component) + m_root.component->setBounds({}); for (auto &node : m_root.subNodes) node.setBounds(b, m_subFolderIndentation, m_itemMargin, m_itemHeight); @@ -79,13 +84,12 @@ int vdm::TreeView::getMaxIndentLevel() const //-------------------------------------------------------------------------------- -void vdm::TreeView::valueTreeChildAdded(juce::ValueTree& parentTree, juce::ValueTree& childWhichHasBeenAdded) +void vdm::TreeView::valueTreeChildAdded(juce::ValueTree &parentTree, juce::ValueTree &childWhichHasBeenAdded) { if (auto node = getNode(parentTree)) { const int index{ parentTree.indexOf(childWhichHasBeenAdded) }; - Node newNode - { + Node newNode{ .component = createTreeViewItem(childWhichHasBeenAdded), .tree = childWhichHasBeenAdded, .subNodes = {}, @@ -100,7 +104,8 @@ void vdm::TreeView::valueTreeChildAdded(juce::ValueTree& parentTree, juce::Value //-------------------------------------------------------------------------------- -void vdm::TreeView::valueTreeChildRemoved(juce::ValueTree& parentTree, juce::ValueTree& childWhichHasBeenRemoved, int indexFromWhichChildWasRemoved) +void vdm::TreeView::valueTreeChildRemoved(juce::ValueTree &parentTree, juce::ValueTree &childWhichHasBeenRemoved, + int indexFromWhichChildWasRemoved) { juce::ignoreUnused(childWhichHasBeenRemoved); if (auto node = getNode(parentTree)) @@ -113,7 +118,8 @@ void vdm::TreeView::valueTreeChildRemoved(juce::ValueTree& parentTree, juce::Val //-------------------------------------------------------------------------------- -void vdm::TreeView::valueTreeChildOrderChanged(juce::ValueTree& parentTreeWhoseChildrenHaveMoved, int oldIndex, int newIndex) +void vdm::TreeView::valueTreeChildOrderChanged(juce::ValueTree &parentTreeWhoseChildrenHaveMoved, int oldIndex, + int newIndex) { if (auto node = getNode(parentTreeWhoseChildrenHaveMoved)) { @@ -127,7 +133,8 @@ void vdm::TreeView::valueTreeChildOrderChanged(juce::ValueTree& parentTreeWhoseC //-------------------------------------------------------------------------------- -void vdm::TreeView::valueTreePropertyChanged(juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property) +void vdm::TreeView::valueTreePropertyChanged(juce::ValueTree &treeWhosePropertyHasChanged, + const juce::Identifier &property) { juce::ignoreUnused(treeWhosePropertyHasChanged); @@ -170,9 +177,11 @@ int vdm::TreeView::Node::getHeight(int itemHeight, int margin) const //-------------------------------------------------------------------------------- -void vdm::TreeView::Node::setBounds(juce::Rectangle& bounds, int indent, int margin, int height) +void vdm::TreeView::Node::setBounds(juce::Rectangle &bounds, int indent, int margin, int height) { - component->setBounds(bounds.removeFromTop(height)); + if (component) + component->setBounds(bounds.removeFromTop(height)); + bounds.removeFromTop(margin); if (DirectoryModel::IsDirOpen(tree)) @@ -197,21 +206,25 @@ void vdm::TreeView::Node::setBounds(juce::Rectangle& bounds, int indent, in //-------------------------------------------------------------------------------- -void vdm::TreeView::Node::initialize(juce::ValueTree t, const std::function(juce::ValueTree)>& fn) +void vdm::TreeView::Node::initialize(juce::ValueTree t, + const std::function(juce::ValueTree)> &fn) { tree = t; component = fn(t); - for (auto child : tree) + if (component) { - Node subNode; - subNode.initialize(child, fn); - subNodes.push_back(std::move(subNode)); + for (auto child : tree) + { + Node subNode; + subNode.initialize(child, fn); + subNodes.push_back(std::move(subNode)); + } } } //-------------------------------------------------------------------------------- -vdm::TreeView::Node* vdm::TreeView::getNode(juce::ValueTree tree) +vdm::TreeView::Node *vdm::TreeView::getNode(juce::ValueTree tree) { std::stack path; for (auto t = tree; t.isValid(); t = t.getParent()) @@ -224,7 +237,8 @@ vdm::TreeView::Node* vdm::TreeView::getNode(juce::ValueTree tree) while (!path.empty() && node) { - const auto it = std::ranges::find_if(node->subNodes, [&path](auto &item){ return item.tree.getType() == path.top(); }); + const auto it = + std::ranges::find_if(node->subNodes, [&path](auto &item) { return item.tree.getType() == path.top(); }); if (it != node->subNodes.end()) { node = &*it; diff --git a/README.md b/README.md index 9e822ed..c89e4d6 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,14 @@ A couple JUCE modules that are useful for representing and interacting with files and directories through `juce::ValueTree`. It allows displaying a directory's contents in a tree view and allowing the user to make selections and open/close directories with their mouse or arrow keys. All of this library's functionality is based on `juce::ValueTree` properties. -This means you can receive listener callbacks whenever a new item is selected or a directory is opened/closed. +This means you can receive listener callbacks whenever a new item is selected or a directory is opened/closed (or anything else you feel like). ![Demo App Screenshot](/screenshot.png) This code was originally written for the preset browser in [PFT](https://vainaudio.com/product/pft/). I added some minor improvements and expansions mostly aimed at making the library more flexible. +That being said it's not quite flexible enough for super general use cases. +The classes in this library are written to work with each other to display disk contents as a `juce::ValueTree`. ## Included: @@ -57,6 +59,7 @@ The `vdm_ui` module has a `TreeView` base class. The motivation for creating it is that I don't like `juce::TreeView`. I think it does too much. The `vdm::TreeView` only handles creating and laying out child components. +The return value from `vdm::TreeView::createTreeViewItem` is null checked but, the class isn't really intended to be used that way so the function should return a valid `juce::Component`. ```c++ class MyTreeView : public vdm::TreeView @@ -72,3 +75,23 @@ juce::ValueTree rootTree = model.getValueTree(); MyTreeView treeView; treeView.setValueTree(rootTree); ``` + +# Adding it to Your Project + +DirectoryModel is organized as a set of JUCE modules. +To use it in your project include the `Modules` directory in `CMakeLists.txt`: + +```cmake +add_subdirectory("DirectoryModel/Modules") +``` + +Link to the following targets: + +```cmake +target_link_libraries("Project" + PRIVATE + vdm::vdm + vdm::vdm_directory + vdm::vdm_ui +) +``` diff --git a/Tests/SelectionModelTests.h b/Tests/SelectionModelTests.h index 2b3515e..2eae72a 100644 --- a/Tests/SelectionModelTests.h +++ b/Tests/SelectionModelTests.h @@ -187,7 +187,7 @@ using ::testing::_; class MockSelectionModelListener : public vdm::SelectionModelListener { public: - MOCK_METHOD(void, onSelectedTreeChanged, (juce::ValueTree), (override)); + MOCK_METHOD(void, onTreeSelectionChanged, (juce::ValueTree), (override)); }; //-------------------------------------------------------------------------------- @@ -215,7 +215,7 @@ TEST(SelectionModel, SelectionListenerInit) MockSelectionModelListener listener; - EXPECT_CALL(listener, onSelectedTreeChanged(_)).Times(2); + EXPECT_CALL(listener, onTreeSelectionChanged(_)).Times(2); listener.setSelectionModelValueTree(root); } @@ -241,7 +241,7 @@ TEST(SelectionModel, SelectionListener) MockSelectionModelListener listener; - EXPECT_CALL(listener, onSelectedTreeChanged(_)).Times(1); + EXPECT_CALL(listener, onTreeSelectionChanged(_)).Times(1); listener.setSelectionModelValueTree(root); vdm::SelectionModel::RequestSelectTree(childA);