diff --git a/dmain.lfm b/dmain.lfm index 5037c83..f70fda4 100644 --- a/dmain.lfm +++ b/dmain.lfm @@ -3713,6 +3713,7 @@ object dmMain: TdmMain FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } ImageIndex = 95 + OnClick = mbCheckAllClick end object mbCheckInvert: TMenuItem Caption = 'Инвертировать' @@ -3793,6 +3794,7 @@ object dmMain: TdmMain FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } ImageIndex = 96 + OnClick = mbCheckNoneClick end end object mbOptions: TMenuItem diff --git a/dmain.pas b/dmain.pas index 33ebde2..f3c9b5b 100644 --- a/dmain.pas +++ b/dmain.pas @@ -5,7 +5,7 @@ unit dMain; interface uses - Classes, SysUtils, FileUtil, Controls, Menus, uPackage, uPackageList; + Classes, SysUtils, FileUtil, Controls, Menus, VirtualTrees, uPackage, uPackageList; type @@ -35,6 +35,8 @@ type pmInstallTree: TPopupMenu; pmInstallCheck: TPopupMenu; procedure DataModuleCreate(Sender: TObject); + procedure mbCheckAllClick(Sender: TObject); + procedure mbCheckNoneClick(Sender: TObject); procedure mbCollapseTreeClick(Sender: TObject); procedure mbExpandTreeClick(Sender: TObject); private @@ -59,6 +61,8 @@ type SoftPackages: TPackageList; // Список объектов пакетов утилит для запуска ToolsPackages: TPackageList; + // Установка состояния отметки для всех корневых нод указанного дерева + procedure SetVSTCheckState(AVST: TBaseVirtualTree; AState: boolean); end; var @@ -75,13 +79,73 @@ uses fMain; {------------------------------------------------------------------------------ Конструктор: TdmMain.Create() Назначение: Создание датамодуля, подготовка путей и списков пакетов -Вх. параметры: Sender: TObject ------------------------------------------------------------------------------} procedure TdmMain.DataModuleCreate(Sender: TObject); begin PrepareDirs(); PreparePackages(); end; + +{------------------------------------------------------------------------------ +Конструктор: TdmMain.SetVSTCheckState() +Назначение: Установка состояния отметки для всех корневых нод указанного дерева +Вх. параметры: + AVST: TBaseVirtualTree - дерево + AState: boolean - состояние отметок: TRUE выбрать все, FALSE снять выбор со всех +------------------------------------------------------------------------------} +procedure TdmMain.SetVSTCheckState(AVST: TBaseVirtualTree; AState: boolean); +var + Node: PVirtualNode; + + // Установка состояния отметки ноды-родителя дочерним нодам + procedure CheckChildNodes(ANode: PVirtualNode); + var + ChildNode: PVirtualNode; + begin + ChildNode := AVST.GetFirstChild(ANode); + while Assigned(ChildNode) do + begin + CheckChildNodes(ChildNode); + ChildNode^.CheckState := ChildNode^.Parent^.CheckState; + ChildNode := AVST.GetNextSibling(ChildNode); + end; + end; + +begin + AVST.BeginUpdate; + try + Node := AVST.GetFirst; + while Assigned(Node) do + begin + if AState = true then + Node^.CheckState := csCheckedNormal + else + Node^.CheckState := csUncheckedNormal; + CheckChildNodes(Node); + Node := AVST.GetNextSibling(Node); + end; + finally + AVST.EndUpdate; + end; +end; + +{------------------------------------------------------------------------------ +Конструктор: TdmMain.mbCheckAllClick() +Назначение: Обработка клика п. меню "Выбрать всё" +------------------------------------------------------------------------------} +procedure TdmMain.mbCheckAllClick(Sender: TObject); +begin + SetVSTCheckState(fmMain.vstSoftPkgContents, true); +end; + +{------------------------------------------------------------------------------ +Конструктор: TdmMain.mbCheckNoneClick() +Назначение: Обработка клика п. меню "Снять выбор" +------------------------------------------------------------------------------} +procedure TdmMain.mbCheckNoneClick(Sender: TObject); +begin + SetVSTCheckState(fmMain.vstSoftPkgContents, false); +end; {------------------------------------------------------------------------------ Процедура: TdmMain.mbCollapseTreeClick() @@ -138,8 +202,5 @@ begin ToolsPackages.Load(ptTools); end; - - - end. diff --git a/fmain.lfm b/fmain.lfm index 3e3a8a3..7850e70 100644 --- a/fmain.lfm +++ b/fmain.lfm @@ -1,7 +1,7 @@ object fmMain: TfmMain - Left = 299 + Left = 430 Height = 450 - Top = 82 + Top = 108 Width = 350 BorderIcons = [biSystemMenu, biMinimize] Caption = 'ABTool' @@ -3226,6 +3226,7 @@ object fmMain: TfmMain TabHeight = 20 TabIndex = 0 TabOrder = 0 + OnChange = PageControlChange object tabSoft: TTabSheet Caption = 'Установка' ClientHeight = 402 diff --git a/fmain.pas b/fmain.pas index c162daf..1094fd9 100644 --- a/fmain.pas +++ b/fmain.pas @@ -60,6 +60,7 @@ type procedure btnSoftPkgReloadClick(Sender: TObject); // Обрабока клика по кнопке обновления выпадающего меню пакетов утилит procedure btnToolsPkgReloadClick(Sender: TObject); + procedure PageControlChange(Sender: TObject); // Отображение отметок в нодах дерева программ procedure vstSoftPkgContentsInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); @@ -208,6 +209,7 @@ procedure TfmMain.FormCreate(Sender: TObject); begin ReloadPackagesList(ptSoft); ReloadPackagesList(ptTools); + PageControl.ActivePageIndex := 0; end; {------------------------------------------------------------------------------ @@ -227,6 +229,16 @@ procedure TfmMain.btnToolsPkgReloadClick(Sender: TObject); begin ReloadPackagesList(ptTools); end; + +{------------------------------------------------------------------------------ +Процедура: TfmMain.PageControlChange() +Назначение: Обрабока переключения вкладок +------------------------------------------------------------------------------} +procedure TfmMain.PageControlChange(Sender: TObject); +begin + // меню выбора должно быть активно только на вкладке "Установка" + dmMain.mbCheck.Enabled := PageControl.ActivePageIndex = 0; +end; {------------------------------------------------------------------------------ Процедура: TfmMain.vstSoftPkgContentsGetText()