OSDN Git Service

PlayTimeParams editor changed
[winbottle/winbottle.git] / bottleclient / SettingForm.pas
index 135595f..0c8dad0 100755 (executable)
@@ -11,7 +11,8 @@ uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   ComCtrls, StdCtrls, ExtCtrls, BottleDef, Spin,
   CPCConfigTreeView, ColorSettingFrame, BottleChainListFrame, SakuraSeekerInstance,
-  ImgList, StrListEditor, SppList, Plugins;
+  ImgList, StrListEditor, SppList, Plugins, Clipbrd, SsPlayTime, StrUtils,
+  SpecialCharEditor;
 
 type
   TfrmSetting = class(TForm)
@@ -25,8 +26,6 @@ type
     rgpWhenCtrlReturn: TRadioGroup;
     memDefaultScript: TMemo;
     lblDefaultScript: TLabel;
-    grpLocalConfirm: TGroupBox;
-    cbxIgnoreTimeCritical: TCheckBox;
     tstReceive: TTabSheet;
     OpenDialog: TOpenDialog;
     spnWaitScriptEnd: TSpinEdit;
@@ -41,18 +40,11 @@ type
     tstDetailed: TTabSheet;
     lblFMOName: TLabel;
     memFMOName: TMemo;
-    grpProxy: TGroupBox;
-    lblProxyAddress: TLabel;
-    lblProxyPort: TLabel;
-    edtProxyAddress: TEdit;
-    edtProxyPort: TEdit;
-    cbxUseHttpProxy: TCheckBox;
     tstChannel: TTabSheet;
     lblAutoJoinChannels: TLabel;
     memAutoJoinChannels: TMemo;
     cbxAutoStart: TCheckBox;
     btnUseCurrentJoinChannels: TButton;
-    Label6: TLabel;
     ImageList: TImageList;
     tstSurfacePreview: TTabSheet;
     lblSurfacePreview: TLabel;
@@ -68,6 +60,45 @@ type
     rgpTabPosition: TRadioGroup;
     lblGhostDropDownCount: TLabel;
     spnGhostDropDownCount: TSpinEdit;
+    cbxIgnoreTimeCritical: TCheckBox;
+    cbxAutoClip: TCheckBox;
+    btnCopyLUID: TButton;
+    tvwCategory: TTreeView;
+    Label1: TLabel;
+    pnlHeading: TPanel;
+    cbxConfirmOnTabClose: TCheckBox;
+    tstConnection: TTabSheet;
+    grpProxy: TGroupBox;
+    lblProxyAddress: TLabel;
+    lblProxyPort: TLabel;
+    Label6: TLabel;
+    edtProxyAddress: TEdit;
+    edtProxyPort: TEdit;
+    cbxUseHttpProxy: TCheckBox;
+    spnReconnectWait: TSpinEdit;
+    lblReconnectWait: TLabel;
+    lblPartialConfirmFormat: TLabel;
+    edtPartialConfirmFormat: TEdit;
+    cbxAutoPartialConfirm: TCheckBox;
+    tstPlayTime: TTabSheet;
+    grpPlayTimeParams: TGroupBox;
+    lblPlayTimeProfile: TLabel;
+    cbxPlayTimeProfile: TComboBox;
+    spnCostDBChar: TSpinEdit;
+    spnCostWait: TSpinEdit;
+    spnCostSurface: TSpinEdit;
+    spnCostChar: TSpinEdit;
+    spnCostQuickChar: TSpinEdit;
+    lblCostWait: TLabel;
+    lblCostSurface: TLabel;
+    lblCostChar: TLabel;
+    lblCostDBChar: TLabel;
+    lblCostQuickChar: TLabel;
+    btnSavePlayTimeProfile: TButton;
+    lvwCostSpecials: TListView;
+    lblCostSpecials: TLabel;
+    btnPlaySpecialAdd: TButton;
+    btnPlaySpecialDelete: TButton;
     procedure FormClose(Sender: TObject; var Action: TCloseAction);
     procedure edtProxyPortKeyPress(Sender: TObject; var Key: Char);
     procedure ctvBottleNodeChecked(Sender: TObject;
@@ -80,9 +111,25 @@ type
     procedure lvwPluginListDblClick(Sender: TObject);
     procedure edtLUIDEnter(Sender: TObject);
     procedure edtLUIDExit(Sender: TObject);
+    procedure btnCopyLUIDClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure tvwCategoryChange(Sender: TObject; Node: TTreeNode);
+    procedure tvwCategoryMouseMove(Sender: TObject; Shift: TShiftState; X,
+      Y: Integer);
+    procedure cbxPlayTimeProfileChange(Sender: TObject);
+    procedure btnSavePlayTimeProfileClick(Sender: TObject);
+    procedure spnCostWaitChange(Sender: TObject);
+    procedure btnPlaySpecialAddClick(Sender: TObject);
+    procedure btnPlaySpecialDeleteClick(Sender: TObject);
+    procedure lvwCostSpecialsDblClick(Sender: TObject);
   private
     { Private \90é\8c¾ }
     FOldLUID: String;
+    FSpinUpdateFlag: boolean;
+    procedure LoadPlayTimeProfiles;
+    procedure PlayTimeParamsToSpinControl(Params: TSsPlayTimeParams);
+    procedure SpinControlToPlayTimeParams(Params: TSsPlayTimeParams);
+    procedure UpdateSpecialChars;
   public
     { Public \90é\8c¾ }
     procedure Execute;
@@ -101,6 +148,9 @@ implementation
 
 {$R *.DFM}
 
+const
+  SettingIcon = 4;
+
 procedure TfrmSetting.Execute;
 var i: integer;
     Node: TCPCGroupNode;
@@ -110,7 +160,11 @@ begin
   cbxShowRuler.Checked := Pref.ShowRuler;
   cbxIgnoreTimeCritical.Checked := Pref.IgnoreTimeCritical;
   cbxNoSendGhostList.Checked := Pref.NoSendGhostList;
+  edtPartialConfirmFormat.Text := Pref.PartialConfirmFormat;
+  cbxAutoPartialConfirm.Checked := Pref.AutoPartialConfirm;
   cbxConfirmOnExit.Checked := Pref.ConfirmOnExit;
+  cbxConfirmOnTabClose.Checked := Pref.ConfirmOnTabClose;
+  cbxAutoClip.Checked := Pref.AutoClip;
   //
   with frmColorSetting do begin
     Color['H'] := Pref.TalkColorH;
@@ -122,6 +176,13 @@ begin
     Color['Background'] := Pref.BgColor;
   end;
   //
+  cbxPlayTimeProfile.Items.Clear;
+  cbxPlayTimeProfile.Items.Add(Pref.PlayTimeParams.ProfileName);
+  cbxPlayTimeProfile.ItemIndex := 0;
+  LoadPlayTimeProfiles;
+  PlayTimeParamsToSpinControl(Pref.PlayTimeParams);
+  UpdateSpecialChars;
+  //
   cbxAutoStart.Checked := Pref.AutoStart;
   rgpTabPosition.ItemIndex := Ord(Pref.TabPosition);
   spnGhostDropDownCount.Value := Pref.GhostDropDownCount;
@@ -156,6 +217,9 @@ begin
   cbxUseHttpProxy.Checked := Pref.UseHttpProxy;
   edtProxyAddress.Text := Pref.ProxyAddress;
   edtProxyPort.Text := IntToStr(Pref.ProxyPort);
+  //
+  spnReconnectWait.Value := Pref.ReconnectWait;
+  //
   edtLUID.Text := Pref.LUID;
   //
   memFMOName.Lines := Pref.FMOName;
@@ -190,7 +254,11 @@ begin
   Pref.ShowRuler := cbxShowRuler.Checked;
   Pref.IgnoreTimeCritical := cbxIgnoreTimeCritical.Checked;
   Pref.NoSendGhostList := cbxNoSendGhostList.Checked;
+  Pref.PartialConfirmFormat := edtPartialConfirmFormat.Text;
+  Pref.AutoPartialConfirm := cbxAutoPartialConfirm.Checked;
   Pref.ConfirmOnExit := cbxConfirmOnExit.Checked;
+  Pref.ConfirmOnTabClose := cbxConfirmOnTabClose.Checked;
+  Pref.AutoClip := cbxAutoClip.Checked;
   //
   with frmColorSetting do begin
     Pref.TalkColorH := Color['H'];
@@ -202,6 +270,9 @@ begin
     Pref.BgColor := Color['Background'];
   end;
   //
+  Pref.PlayTimeParams.ProfileName := cbxPlayTimeProfile.Text;
+  SpinControlToPlayTimeParams(Pref.PlayTimeParams);
+  //
   Pref.AutoStart := cbxAutoStart.Checked;
   Pref.TabPosition := TTabPosition(rgpTabPosition.ItemIndex);
   Pref.GhostDropDownCount := spnGhostDropDownCount.Value;
@@ -233,6 +304,9 @@ begin
   Pref.UseHttpProxy := cbxUseHttpProxy.Checked;
   Pref.ProxyAddress := edtProxyAddress.Text;
   Pref.ProxyPort := StrToInt(edtProxyPort.Text);
+  //
+  Pref.ReconnectWait := spnReconnectWait.Value;
+  //
   Pref.LUID := edtLUID.Text;
   //
   Pref.FMOName := memFMOName.Lines;
@@ -342,4 +416,287 @@ begin
   end;
 end;
 
+procedure TfrmSetting.btnCopyLUIDClick(Sender: TObject);
+begin
+  Clipboard.SetTextBuf(PChar(edtLUID.Text));
+end;
+
+procedure TfrmSetting.FormCreate(Sender: TObject);
+var
+  i: integer;
+  Cap: String;
+  Node: TTreeNode;
+begin
+  for i := 0 to PageControl.PageCount-1 do
+  begin
+    Cap := PageControl.Pages[i].Caption;
+    if Pos(':', Cap) > 0 then
+      Cap := Copy(Cap, 1, Pos(':', Cap)-1);
+    Node := tvwCategory.Items.Add(nil, Cap);
+    Node.ImageIndex := -1;
+    Node.SelectedIndex := SettingIcon;
+  end;
+  tvwCategoryChange(Self, tvwCategory.Items[0]);
+  tvwCategory.Items[0].Selected := true;
+end;
+
+procedure TfrmSetting.tvwCategoryChange(Sender: TObject; Node: TTreeNode);
+begin
+  PageControl.ActivePageIndex := Node.Index;
+  pnlHeading.Caption := PageControl.ActivePage.Caption;
+end;
+
+procedure TfrmSetting.tvwCategoryMouseMove(Sender: TObject;
+  Shift: TShiftState; X, Y: Integer);
+var
+  Node: TTreeNode;
+  NewHint: String;
+  CPos: TPoint;
+begin
+  Node := tvwCategory.GetNodeAt(X, Y);
+  if Node <> nil then
+  begin
+    NewHint := PageControl.Pages[Node.Index].Caption;
+    if tvwCategory.Hint <> NewHint then
+    begin
+      tvwCategory.Hint := NewHint;
+      GetCursorPos(CPos);
+      Application.ActivateHint(CPos);
+    end;
+  end else
+  begin
+    tvwCategory.Hint := '';
+    Application.HideHint;
+  end;
+end;
+
+procedure TfrmSetting.PlayTimeParamsToSpinControl(Params: TSsPlayTimeParams);
+begin
+  FSpinUpdateFlag := true;
+  with Params do
+  begin
+    spnCostWait.Value         := CostWait;
+    spnCostSurface.Value      := CostSurface;
+    spnCostChar.Value         := CostChar;
+    spnCostDBChar.Value       := CostDBChar;
+    spnCostQuickChar.Value    := CostQuickChar;
+    lvwCostSpecials.Items.Clear;
+  end;
+  FSpinUpdateFlag := false;
+end;
+
+procedure TfrmSetting.SpinControlToPlayTimeParams(Params: TSsPlayTimeParams);
+begin
+  with Params do
+  begin
+    CostWait         := spnCostWait.Value;
+    CostSurface      := spnCostSurface.Value;
+    CostChar         := spnCostChar.Value;
+    CostDBChar       := spnCostDBChar.Value;
+    CostQuickChar    := spnCostQuickChar.Value;
+  end;
+end;
+
+
+procedure TfrmSetting.LoadPlayTimeProfiles;
+var i: integer;
+    F: TSearchRec;
+    Path, Item: String;
+begin
+  Path := ExtractFilePath(Application.ExeName);
+  i := FindFirst(Path + 'playtime\*.txt', 0, F);
+  if i = 0 then begin
+    repeat
+      Item := ChangeFileExt(F.Name, '');
+      if cbxPlayTimeProfile.Items.IndexOf(Item) < 0 then
+        cbxPlayTimeProfile.Items.Add(ChangeFileExt(F.Name, ''));
+      i := FindNext(F);
+    until i <> 0;
+  end;
+  FindClose(F);
+end;
+
+procedure TfrmSetting.cbxPlayTimeProfileChange(Sender: TObject);
+var
+  Params: TSsPlayTimeParams;
+  Strs: TStringList;
+  Path, ProName: String;
+begin
+  try
+    Strs := TStringList.Create;
+    ProName := cbxPlayTimeProfile.Text;
+    try
+      Path := ExtractFilePath(Application.ExeName) + 'playtime\';
+      Strs.LoadFromFile(Path + ProName + '.txt');
+      Params := StringToComponent(Strs.Text) as TSsPlayTimeParams;
+      try
+        PlayTimeParamsToSpinControl(Params);
+        Pref.PlayTimeParams.Assign(Params);
+        UpdateSpecialChars;
+      finally
+        Params.Free;
+      end;
+    finally
+      Strs.Free;
+    end;
+    with cbxPlayTimeProfile do
+    begin
+      Items.Clear;
+      LoadPlayTimeProfiles;
+      ItemIndex := Items.IndexOf(ProName);
+    end;
+  except
+    ; // Do nothing
+  end;
+end;
+
+procedure TfrmSetting.btnSavePlayTimeProfileClick(Sender: TObject);
+var
+  ProfileName, Path, FileName: String;
+  Strs: TStringList;
+begin
+  ProfileName := cbxPlayTimeProfile.Text;
+  if InputQuery('\83v\83\8d\83t\83@\83C\83\8b\96¼', '\95Û\91\82·\82é\83v\83\8d\83t\83@\83C\83\8b\96¼', ProfileName) then
+  begin
+    try
+      Path := ExtractFilePath(Application.ExeName) + 'playtime\';
+      FileName := Path + ProfileName + '.txt';
+      if FileExists(FileName) then
+        if MessageDlg(Format('\83v\83\8d\83t\83@\83C\83\8b"%s"\82ð\8fã\8f\91\82«\82µ\82Ü\82·', [ProfileName]),
+          mtConfirmation, mbOkCancel, 0) = mrCancel then
+          Exit;
+      Strs := TStringList.Create;
+      try
+        SpinControlToPlayTimeParams(Pref.PlayTimeParams);
+        Pref.PlayTimeParams.ProfileName := ProfileName;
+        Strs.Text := ComponentToString(Pref.PlayTimeParams);
+        Strs.SaveToFile(FileName);
+      finally
+        Strs.Free;
+      end;
+      with cbxPlayTimeProfile do
+      begin
+        Items.Clear;
+        Items.Add(ProfileName);
+        ItemIndex := 0;
+        LoadPlayTimeProfiles;
+      end;
+    except
+      on E: Exception do
+        ShowMessage('\95Û\91\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B' + E.Message);
+    end;
+  end;
+end;
+
+procedure TfrmSetting.spnCostWaitChange(Sender: TObject);
+var
+  ProName: String;
+const
+  Modified = '(\95Ï\8dX\8dÏ\82Ý)';
+begin
+  if FSpinUpdateFlag then
+    Exit;
+  if RightBStr(cbxPlayTimeProfile.Text, Length(Modified)) <> Modified then
+  begin
+    ProName := Format('%s%s', [cbxPlayTimeProfile.Text, Modified]);
+    with cbxPlayTimeProfile do
+    begin
+      Items.Clear;
+      Items.Add(ProName);
+      ItemIndex := 0;
+      LoadPlayTimeProfiles;
+    end;
+  end;
+end;
+
+procedure TfrmSetting.btnPlaySpecialAddClick(Sender: TObject);
+var
+  Item: TListItem;
+  SPChar: TSsPlayTimeSpecialChar;
+begin
+  Application.CreateForm(TfrmSpecialCharEditor, frmSpecialCharEditor);
+  try
+    with frmSpecialCharEditor do
+    begin
+      SpecialChar := '';
+      Cost := 50;
+      if Execute then
+      begin
+        SPChar := Pref.PlayTimeParams.SpecialChars.Add as TSsPlayTimeSpecialChar;
+        SPChar.Char := SpecialChar;
+        SPChar.Wait := Cost;
+        Item := lvwCostSpecials.Items.Add;
+        Item.Caption := SPChar.DisplayChar;
+        Item.SubItems.Add(IntToStr(Cost));
+        spnCostWaitChange(Self);
+      end;
+    end;
+  finally
+    frmSpecialCharEditor.Release;
+  end;
+end;
+
+procedure TfrmSetting.btnPlaySpecialDeleteClick(Sender: TObject);
+begin
+  with lvwCostSpecials do
+    if Selected <> nil then
+    begin
+      Pref.PlayTimeParams.SpecialChars.Delete(Selected.Index);
+      Selected.Delete;
+      spnCostWaitChange(Self);
+    end;
+end;
+
+procedure TfrmSetting.lvwCostSpecialsDblClick(Sender: TObject);
+var
+  Item: TListItem;
+  SPChar: TSsPlayTimeSpecialChar;
+begin
+  with lvwCostSpecials do
+  begin
+    Item := Selected;
+    if Item <> nil then
+    begin
+      Application.CreateForm(TfrmSpecialCharEditor, frmSpecialCharEditor);
+      try
+        with frmSpecialCharEditor do
+        begin
+          SPChar := Pref.PlayTimeParams.SpecialChars.Items[Item.Index] as TSsPlayTimeSpecialChar;
+          SpecialChar := SPChar.Char;
+          Cost := SPChar.Wait;
+          if Execute then
+          begin
+            SPChar.Char := SpecialChar;
+            SPChar.Wait := Cost;
+            Item.Caption := SPChar.DisplayChar;
+            Item.SubItems[0] := IntToStr(Cost);
+            spnCostWaitChange(Self);
+          end;
+        end;
+      finally
+        frmSpecialCharEditor.Release;
+      end;
+    end;
+  end;
+end;
+
+procedure TfrmSetting.UpdateSpecialChars;
+var
+  i: integer;
+  Item: TListItem;
+  SPChar: TSsPlayTimeSpecialChar;
+begin
+  with lvwCostSpecials do
+  begin
+    Items.Clear;
+    for i := 0 to Pref.PlayTimeParams.SpecialChars.Count-1 do
+    begin
+      SPChar := Pref.PlayTimeParams.SpecialChars.Items[i] as TSsPlayTimeSpecialChar;
+      Item := Items.Add;
+      Item.Caption := SPChar.DisplayChar;
+      Item.SubItems.Add(IntToStr(SPChar.Wait));
+    end;
+  end;
+end;
+
 end.