Don't allow project files to be renamed or deleted in project tree pane.

This prevents any potential breakage of a project due to the file changes.
It is overly zealous because the project manager doesn't actually have any
knowledge of which files belong to the project.

Fixes: https://gitlab.com/kicad/code/kicad/-/issues/9654
This commit is contained in:
Wayne Stambaugh 2021-11-19 11:39:12 -05:00
parent 48c3734eea
commit 802cfc1a7d
3 changed files with 38 additions and 4 deletions

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -72,6 +72,26 @@ void PROJECT_TREE_ITEM::SetState( int state )
}
bool PROJECT_TREE_ITEM::CanDelete() const
{
if( m_type == TREE_FILE_TYPE::DIRECTORY
|| m_type == TREE_FILE_TYPE::LEGACY_PROJECT
|| m_type == TREE_FILE_TYPE::JSON_PROJECT
|| m_type == TREE_FILE_TYPE::LEGACY_SCHEMATIC
|| m_type == TREE_FILE_TYPE::SEXPR_SCHEMATIC
|| m_type == TREE_FILE_TYPE::LEGACY_PCB
|| m_type == TREE_FILE_TYPE::SEXPR_PCB
|| m_type == TREE_FILE_TYPE::DRAWING_SHEET
|| m_type == TREE_FILE_TYPE::FOOTPRINT_FILE
|| m_type == TREE_FILE_TYPE::SCHEMATIC_LIBFILE
|| m_type == TREE_FILE_TYPE::SEXPR_SYMBOL_LIB_FILE
|| m_type == TREE_FILE_TYPE::DESIGN_RULES )
return false;
return true;
}
const wxString PROJECT_TREE_ITEM::GetDir() const
{
if( TREE_FILE_TYPE::DIRECTORY == m_type )
@ -84,7 +104,7 @@ const wxString PROJECT_TREE_ITEM::GetDir() const
bool PROJECT_TREE_ITEM::Rename( const wxString& name, bool check )
{
// this is broken & unsafe to use on linux.
if( m_type == TREE_FILE_TYPE::DIRECTORY )
if( !CanRename() )
return false;
if( name.IsEmpty() )
@ -128,6 +148,9 @@ bool PROJECT_TREE_ITEM::Rename( const wxString& name, bool check )
void PROJECT_TREE_ITEM::Delete()
{
if( !CanDelete() )
return;
wxString errMsg;
if( !KIPLATFORM::ENV::MoveToTrash( GetFileName(), errMsg ) )

View File

@ -80,6 +80,16 @@ public:
void Activate( PROJECT_TREE_PANE* aTreePrjFrame );
void SetState( int state );
/**
* Determine if a file can be deleted via the project tree pane.
*
* @note Any of the files that could potentially break a project are flagged as cannot delete
* or rename.
*
* @return false if the file managed by this item cannot be deleted or true if it can.
*/
bool CanDelete() const;
bool CanRename() const { return CanDelete(); }
private:
TREE_FILE_TYPE m_type; // = TREE_PROJECT, TREE_DIRECTORY ...

View File

@ -642,6 +642,9 @@ void PROJECT_TREE_PANE::onRight( wxTreeEvent& Event )
continue;
}
can_delete = item->CanDelete();
can_rename = item->CanRename();
wxString full_file_name = item->GetFileName();
switch( item->GetType() )
@ -653,7 +656,6 @@ void PROJECT_TREE_PANE::onRight( wxTreeEvent& Event )
if( item->GetId() == m_TreeProject->GetRootItem() )
{
can_switch_to_project = false;
can_delete = false;
}
else
{
@ -665,7 +667,6 @@ void PROJECT_TREE_PANE::onRight( wxTreeEvent& Event )
case TREE_FILE_TYPE::DIRECTORY:
can_switch_to_project = false;
can_edit = false;
can_rename = false;
break;
default: