This repository has been archived on 2025-07-14. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
abtool/dmain.pas
anthony 685274a356 НАСТРОЙКИ
Отображение формы настроек переделано. Теперь она создаётся только 1 раз при первом вызове.
Добавлен выпадающий списк для выбора локализаций. Кнопка сброса к дефолту изменена.
Чтение настроек из abtool.ini (кроме локализаций). Сброс контроллов к актуальным настройкам при каждом показе формы настроек.
Считанные настройки хранятся в глобальной переменной внутри uOptions. Таким образом:
- исключены циклические ссылки с участием dMain ради доступа к настройкам
- теперь можно только вызвать конструктор TOptions, а сам созданный объект нигде не сохранять: объект GlobalOptions уже будет доступен
Новая функция dMain.GetLocalesIniFileList для получения списка файлов локализаций.
Обновлены ini-файлы. Мелочи по оформлению кода.
2019-01-26 01:37:22 +08:00

276 lines
10 KiB
ObjectPascal

unit dMain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Controls, Menus, Forms, PopupNotifier, Dialogs,
VirtualTrees, uPackage, uPackageList, fOptions, uOptions;
type
{ TdmMain }
TdmMain = class(TDataModule)
imgIcons: TImageList;
mbRefresh: TMenuItem;
MenuItem1: TMenuItem;
mmMain: TMainMenu;
mbInstallCheckAll: TMenuItem;
mbInstallExpandTree: TMenuItem;
mbInstallCollapseTree: TMenuItem;
mbInstallCheckInvert: TMenuItem;
mbInstallCheckNone: TMenuItem;
mbTree: TMenuItem;
mbCollapseTree: TMenuItem;
mbExpandTree: TMenuItem;
mbCheck: TMenuItem;
mbCheckAll: TMenuItem;
mbCheckInvert: TMenuItem;
mbCheckNone: TMenuItem;
mbOptions: TMenuItem;
mbHelp: TMenuItem;
mbOnlineHelp: TMenuItem;
mbAbout: TMenuItem;
mbOptionsMain: TMenuItem;
mbOptionsPkg: TMenuItem;
pmInstallTree: TPopupMenu;
pmInstallCheck: TPopupMenu;
procedure DataModuleCreate(Sender: TObject);
procedure mbAboutClick(Sender: TObject);
procedure mbCheckAllClick(Sender: TObject);
procedure mbCheckNoneClick(Sender: TObject);
procedure mbCollapseTreeClick(Sender: TObject);
procedure mbExpandTreeClick(Sender: TObject);
procedure mbOptionsMainClick(Sender: TObject);
procedure mbOptionsPkgClick(Sender: TObject);
procedure mbRefreshClick(Sender: TObject);
private
// Форма настроек
fmOptions: TfmOptions;
// Подготовка директорий
procedure PrepareDirs();
// Подготовка списков пакетов
procedure PreparePackageLists();
public
// путь к файлу ABTool.exe
ABToolExePath: String;
// путь к директории ABTool
ABToolDataPath: String;
// путь к директории ABTool\Packages
ABToolPkgPath: String;
// путь к директории ABTool\Languages
ABToolLangPath: String;
// путь к директории ABTool\Logs
ABToolLogPath: String;
// Список объектов пакетов программ для установки
SoftPackages: TPackageList;
// Список объектов пакетов утилит для запуска
ToolsPackages: TPackageList;
// Установка состояния отметки для всех корневых нод указанного дерева
procedure SetVSTCheckState(AVST: TBaseVirtualTree; AState: boolean);
// Показ формы настроек на указанной странице и возврат модального результата
function CallOptionsForm(APageIndex: byte = 0): TModalResult;
end;
var
dmMain: TdmMain;
implementation
uses fMain;
{$R *.lfm}
{ TdmMain }
{------------------------------------------------------------------------------
Конструктор: TdmMain.Create()
Назначение: Создание датамодуля, подготовка путей и списков пакетов
------------------------------------------------------------------------------}
procedure TdmMain.DataModuleCreate(Sender: TObject);
begin
PrepareDirs();
PreparePackageLists();
TOptions.Create(dmMain.ABToolDataPath + '\abtool.ini');
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()
Назначение: Сворачивание дерева на активной вкладке главного окна
------------------------------------------------------------------------------}
procedure TdmMain.mbCollapseTreeClick(Sender: TObject);
begin
case (fmMain.PageControl.ActivePageIndex) of
0: fmMain.vstSoftPkgContents.FullCollapse();
1: fmMain.vstToolsPkgContents.FullCollapse();
end;
end;
{------------------------------------------------------------------------------
Процедура: TdmMain.mbCollapseTreeClick()
Назначение: Разворачивание дерева на активной вкладке главного окна
------------------------------------------------------------------------------}
procedure TdmMain.mbExpandTreeClick(Sender: TObject);
begin
case (fmMain.PageControl.ActivePageIndex) of
0: fmMain.vstSoftPkgContents.FullExpand();
1: fmMain.vstToolsPkgContents.FullExpand();
end;
end;
{------------------------------------------------------------------------------
Процедура: TdmMain.mbRefreshClick()
Назначение: Обновление списка пакетов и дерева на активной вкладке главного окна
------------------------------------------------------------------------------}
procedure TdmMain.mbRefreshClick(Sender: TObject);
begin
case (fmMain.PageControl.ActivePageIndex) of
0: fmMain.btnSoftPkgReload.Click;
1: fmMain.btnToolsPkgReload.Click;
end;
end;
{------------------------------------------------------------------------------
Процедура: TdmMain.PrepareDirs()
Назначение: Подготовка директорий
------------------------------------------------------------------------------}
procedure TdmMain.PrepareDirs();
begin
ABToolExePath := ExtractFilePath(ParamStr(0));
ABToolDataPath := ABToolExePath + 'ABTool\';
ABToolPkgPath := ABToolDataPath + 'Packages\';
ABToolLangPath := ABToolDataPath + 'Languages\';
ABToolLogPath := ABToolDataPath + 'Logs\';
if not DirectoryExists(ABToolPkgPath) then
ForceDirectories(ABToolPkgPath);
if not DirectoryExists(ABToolLangPath) then
ForceDirectories(ABToolLangPath);
if not DirectoryExists(ABToolLogPath) then
ForceDirectories(ABToolLogPath);
end;
{------------------------------------------------------------------------------
Процедура: TdmMain.PreparePackageLists()
Назначение: Подготовка списков пакетов
------------------------------------------------------------------------------}
procedure TdmMain.PreparePackageLists();
begin
SoftPackages := TPackageList.Create;
SoftPackages.Load(ptSoft);
ToolsPackages := TPackageList.Create;
ToolsPackages.Load(ptTools);
end;
{------------------------------------------------------------------------------
Функция: TdmMain.CallOptionsForm()
Назначение: Показ формы настроек на указанной странице и возврат модального
результата
Возвращает: TModalResult
------------------------------------------------------------------------------}
function TdmMain.CallOptionsForm(APageIndex: byte = 0): TModalResult;
begin
if fmOptions = nil then
fmOptions := TfmOptions.Create(fmMain);
fmOptions.PageControl.ActivePageIndex := APageIndex;
Result := fmOptions.ShowModal;
end;
{------------------------------------------------------------------------------
Процедура: TdmMain.mbOptionsMainClick()
Назначение: Обработка клика п. меню "Настройки - Основные..."
------------------------------------------------------------------------------}
procedure TdmMain.mbOptionsMainClick(Sender: TObject);
begin
CallOptionsForm;
end;
{------------------------------------------------------------------------------
Процедура: TdmMain.mbOptionsPkgClick()
Назначение: Обработка клика п. меню "Настройки - Управление пакетами..."
------------------------------------------------------------------------------}
procedure TdmMain.mbOptionsPkgClick(Sender: TObject);
begin
case CallOptionsForm(1) of
mrOK: ;//ShowMessage('mrOK');
mrClose: ;//ShowMessage('mrClose');
end;
end;
{------------------------------------------------------------------------------
Процедура: TdmMain.mbAboutClick()
Назначение: Обработка клика п. меню "Помощь - О программе..."
------------------------------------------------------------------------------}
procedure TdmMain.mbAboutClick(Sender: TObject);
begin
case CallOptionsForm(2) of
mrOK: ;//ShowMessage('mrOK');
mrClose: ;//ShowMessage('mrClose');
end;
end;
end.