Orion9

|
Posted: Sun Jul 12, 2026 19:21 Post subject: |
|
|
| sa wrote: | | Лучше, наверное, запретить перенос значка на разделители, по крайней мере на разрывы – это, к тому же чревато ошибками в работе скрипта. |
Да, это приводит к серьезным ошибкам! Там вообще на ниточке все держится. Если в файле панели будет мальшее отклонение от нормы, то проблемы будут обязательно. Видимо, придется пересматривать считывание панели с учетом разных нюансов, ведь сейчас кнопки просто определяются по наличию ключа button=, а разделители по cmd= с учетом, что ключ button= пустой.
Fix:
| Code: | Func HBarDragIcon(DragIdx, DropIdx)
# проверка индекса получателя
If gHBarMap[DropIdx-1] <> 1 Then Return ShowDragHint("Получатель не может быть разделителем")
# сохранение значка
Local val = IniRead(gHBarFile, "Buttonbar", "button" & DragIdx) |
| sa wrote: | | Возможно, удобнее один из двух разрывов оставлять |
Обновленная функция
 Hidden text | Code: | Func HBarBreakErase(BreakIndex, StopIndex)
Local Count = 0, Range = StopIndex-BreakIndex
If FileGetTime(gHBarFile) <> gHBarFileTs Then
MsgBox("Операция невозможна. Файл главной панели изменился.")
Return
Endif
If BreakIndex < 1 Then
MsgBox("Индекс разрыва не может быть меньше 2")
Return
Endif
Local text = gHBarList.Text, rext = ""
Local rex = RegExp('(?i)(button|cmd|param|path|menu|iconic)(\d+?)=(.*?)(\R|\Z)', text)
If rex.Exec() Then
Do
If BreakIndex = StopIndex Then
If rex.Match[2] < BreakIndex Then
Count += 1
rext &= rex.Match[1] & rex.Match[2] & '=' & rex.Match[3] & auCRLF
EndIf
Else
If rex.Match[2] < BreakIndex Then
Count += 1
rext &= rex.Match[1] & rex.Match[2] & '=' & rex.Match[3] & auCRLF
ElseIf rex.Match[2] >= StopIndex Then
Count += 1
rext &= rex.Match[1] & rex.Match[2]-Range & '=' & rex.Match[3] & auCRLF
EndIf
EndIf
Until not rex.ExecNext()
EndIf
Free(rex)
If rext = "" Then Return MsgBox("Ошибка удаления. Buttoncount=0, BreakIndex=" & BreakIndex)
Local txt = gHBarList.Text
gHBarUndoLoad = txt
If Not gHBarCancel Then
gHBarCancel = true
gHBarCancelLoad = txt
EndIf
# обновление панели
Local NewCount = 0
If BreakIndex = StopIndex Then
NewCount = BreakIndex - 1
Else
NewCount = gHBarMap.Count - Range
EndIf
gHBarList.Text = "[Buttonbar]" & auCRLF & "Buttoncount=" & NewCount & auCRLF & rext
gHBarList.SaveToFile(gHBarFile, gHBarCP)
gHBarUndoTs = FileGetTime(gHBarFile)
gHBarFileTs = FileGetTime(gHBarFile)
If gHBarUndoTs Then
gHBarUndo = true
Else
gHBarUndo = false
gHBarUndoLoad = ""
EndIf
HBarLoad()
SendCommand(2945) # cm_ReloadBarIcons
WinRedraw(0)
EndFunc
|
Добавил к регулярному выражению \Z, иначе последний ключ терялся, если панель заканчивается eof, а не \r\n. В функции HBarMergeOne это тоже нужно подправить.
+Новые два пункта
| Code: | txt &= 'MENUITEM SEPARATOR' & auCRLF
txt &= 'MENUITEM "Добавить разрыв", em_aucmd -1 HBarAddButton -2' & auCRLF
txt &= 'MENUITEM "Добавить разделитель", em_aucmd -1 HBarAddButton 1' & auCRLF
txt &= 'POPUP "Удалить кнопки за разрывом"' & auCRLF
|
 Hidden text | Code: | Func HBarAddButton(IndexType)
# сохранение панели
Local txt = gHBarList.Text
gHBarUndoLoad = txt
If Not gHBarCancel Then
gHBarCancel = true
gHBarCancelLoad = txt
EndIf
# добавление новых ключей
IniWrite(gHBarFile, "Buttonbar", "button" & gHBarMap.Count+1)
IniWrite(gHBarFile, "Buttonbar", "iconic" & gHBarMap.Count+1, 0)
If IndexType = -2 Then
IniWrite(gHBarFile, "Buttonbar", "cmd" & gHBarMap.Count+1, -2)
EndIf
# обновление общего количества кнопок
IniWrite(gHBarFile, "Buttonbar", "Buttoncount", gHBarMap.Count+1)
# запоминание времени последнего изменения
gHBarUndoTs = FileGetTime(gHBarFile)
gHBarFileTs = FileGetTime(gHBarFile)
If gHBarUndoTs Then
gHBarUndo = true
Else
gHBarUndo = false
gHBarUndoLoad = ""
EndIf
HBarLoad()
SendCommand(2945) # cm_ReloadBarIcons
WinRedraw(0)
WinRedraw(2)
EndFunc |
Здесь все было просто. И последний фикс
| Code: | SetHotkeyAction /K:W /H:BS "HBarUndo" |
Иначе клавиша Win чудила с ключами /DM /S, скорее всего из-за последнего.
Ну вот, пока так. Остальные испытания чуть позже. Кстати, WinRedraw(0) все-равно не всегда помогает, увы. |
|