OberonCore
https://forum.oberoncore.ru/

убираем маркеры ошибок без сбивания позиции каретки
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6921
Страница 1 из 1

Автор:  arisu [ Среда, 22 Март, 2023 16:06 ]
Заголовок сообщения:  убираем маркеры ошибок без сбивания позиции каретки

ещё маленькая рацуха: чтобы `DevMarkers.Unmark()` не сбивала позицию каретки. не знаю как вас, а меня это ужасно раздражает. раздражало, то есть, я в LC исправил. правда, пришлось сделать цикл по всем окнам, смотреть, текст ли в них, добывать из TextView контроллер и всё такое — потому что, кажется, другого способа добыть контроллер текстовой модели нет. грязновато, конечно, но в большинстве случаев работает.

это я к тому, чтобы "Dev→Unmark Errors" и перекомпиляция исходника каретку не перемещали в конец текста, если в тексте были маркеры. лично я не всегда удаляю маркеры ошибок, когда правлю (а иногда там каскадные сбои, и правка одного места кучу других ошибок чинит). потом нажимаю Ctrl+K и БУМ! каретка улетела. мелочь, а неприятно.

Автор:  arisu [ Четверг, 23 Март, 2023 04:46 ]
Заголовок сообщения:  Re: BlackBox 2.0

и, значится, быстрохак для `DevMarkers.Unmark()`:
Код:
   (* hack: check all windows, try to find a document with the given text model *)
   PROCEDURE FindController (text: TextModels.Model): TextControllers.Controller;
   VAR
      w: StdWindows.Window;
      tc: TextControllers.Controller;
      c: Controllers.Controller;
      v: Views.View;
   BEGIN tc := NIL;
      IF text # NIL THEN
         w := StdWindows.First();
         WHILE (tc = NIL) & (w # NIL) DO
            IF w.doc # NIL THEN
               v := w.doc.OriginalView(); (* i hope this will throw away any wrappers *)
               IF (v # NIL) & (v IS TextViews.View) THEN
                  c := v(TextViews.View).ThisController();
                  IF (c # NIL) & (c IS TextControllers.Controller) THEN
                     tc := c(TextControllers.Controller);
                     IF tc.text # text THEN tc := NIL END (* not really necessary, but meh... *)
                  END
               END
            END;
            w := StdWindows.Next(w)
         END
      END;
      RETURN tc
   END FindController;

   (* k8: restore caret position *)
   PROCEDURE UnmarkEx* (text: TextModels.Model; c: TextControllers.Controller);
   VAR
      r: TextModels.Reader;
      v: Views.View;
      pos: INTEGER;
      script: Stores.Operation;
      oldpos, obeg, oend: INTEGER;
   BEGIN
      IF c # NIL THEN
         oldpos := c.CaretPos();
         c.GetSelection(obeg, oend);
      ELSE oldpos := 0; obeg := 0; oend := 0
      END;
      Models.BeginModification(Models.clean, text);
      Models.BeginScript(text, "#Dev:DeleteMarkers", script);
      r := text.NewReader(NIL); r.ReadView(v);
      WHILE ~r.eot DO
         IF r.view IS View THEN
            pos := r.Pos() - 1;
            IF oldpos > pos THEN DEC(oldpos) END;
            IF obeg < oend THEN
               IF obeg > pos THEN DEC(obeg) END;
               IF oend > pos THEN DEC(oend) END;
               IF obeg >= oend THEN oldpos := obeg END
            END;
            text.Delete(pos, pos + 1);
            r.SetPos(pos)
         END;
         r.ReadView(v)
      END;
      IF c # NIL THEN
         IF obeg < oend THEN c.SetSelection(obeg, oend)
         ELSIF (oldpos >= 0) & (oldpos <= text.Length()) THEN c.SetCaret(oldpos)
         END
      END;
      INC(thisEra);
      Models.EndScript(text, script);
      Models.EndModification(Models.clean, text);
   END UnmarkEx;

   PROCEDURE Unmark* (text: TextModels.Model);
   BEGIN UnmarkEx(text, FindController(text))
   END Unmark;

Автор:  luowy [ Четверг, 23 Март, 2023 06:25 ]
Заголовок сообщения:  Re: BlackBox 2.0

arisu писал(а):
и, значится, быстрохак для `DevMarkers.Unmark()`:
Код:
   (* hack: check all windows, try to find a document with the given text model *)
   PROCEDURE FindController (text: TextModels.Model): TextControllers.Controller;
   
Try this to see if it meets your needs;
Код:
   PROCEDURE FindController (text: TextModels.Model): TextControllers.Controller;
      VAR c: TextControllers.Controller;
   BEGIN
      c := TextControllers.Focus();
      IF (c # NIL)  &(c.text = text) THEN RETURN c;
      ELSE RETURN NIL;
      END;
   END FindController;
P.S. The embedded text can also be compiled, not just the document of window.

Автор:  arisu [ Четверг, 23 Март, 2023 06:33 ]
Заголовок сообщения:  Re: BlackBox 2.0

luowy писал(а):
Try this to see if it meets your needs
this works most of the time, but the compiler can be called to compile text in inactive window too, and it is using the same procedure to remove markers. so if focused controller is not the one we want, we have to scan windows anyway. so i decided to always scan them: it doesn't take much time, and the code is more straightforward this way.

luowy писал(а):
P.S. The embedded text can also be compiled, not just the document of window.
yes, and your patch solves this case. so it looks that we have to do both: first check if focused controller is the one we want, and then scan windows if our optimistic attempt failed. thank you!

Автор:  arisu [ Четверг, 23 Март, 2023 06:37 ]
Заголовок сообщения:  Re: BlackBox 2.0

so, with the proposed fix, this should work for the majority of cases:
Код:
   PROCEDURE FindController (text: TextModels.Model): TextControllers.Controller;
   VAR
      w: StdWindows.Window;
      tc: TextControllers.Controller;
      c: Controllers.Controller;
      v: Views.View;
   BEGIN ASSERT(text # NIL, 20);
      tc := TextControllers.Focus();
      IF (tc = NIL) OR (tc.text # text) THEN
         tc := NIL; w := StdWindows.First();
         WHILE (tc = NIL) & (w # NIL) DO
            IF w.doc # NIL THEN
               v := w.doc.OriginalView();
               IF (v # NIL) & (v IS TextViews.View) THEN
                  c := v(TextViews.View).ThisController();
                  IF (c # NIL) & (c IS TextControllers.Controller) THEN
                     tc := c(TextControllers.Controller);
                     IF tc.text # text THEN tc := NIL END
                  END
               END
            END;
            w := StdWindows.Next(w)
         END
      END;
      RETURN tc
   END FindController;

Автор:  arisu [ Четверг, 23 Март, 2023 10:15 ]
Заголовок сообщения:  Re: BlackBox 2.0

и это… если такой поисковик внедрить, то в `ConsWindows.Focus()` надо HALT закомментарить, а то консольный сборщик не будет работать.

Автор:  Иван Денисов [ Четверг, 23 Март, 2023 22:10 ]
Заголовок сообщения:  Re: убираем маркеры ошибок без сбивания позиции каретки

В целом годно и без каких-то предсказуемых негативных последствий, так что "рацуха" принимается. Из недочётов только импорт одного модуля получается. Ну и я заменил StdWindows на Windows, чтобы оно работало в MDI сборке также. Ещё контроллер при вызове команды меню возможно и так вычислить без сканирования. А вот при вызове из компилятора, тут да — не обойтись без перебора.

commit 6a7968488d042300912f619cd364bbc7acd1e767

Автор:  arisu [ Пятница, 24 Март, 2023 01:40 ]
Заголовок сообщения:  Re: убираем маркеры ошибок без сбивания позиции каретки

Иван Денисов писал(а):
В целом годно и без каких-то предсказуемых негативных последствий, так что "рацуха" принимается.
отлично, спасибо!

Иван Денисов писал(а):
Ну и я заменил StdWindows на Windows, чтобы оно работало в MDI сборке также.
да блин! надо всё-таки что-то с этим StdWindows решать. оно выглядит как именно тот модуль, куда следует ходить за всеми сервисами, и я вот его уже на автомате импортирую. надо возвращать весь API обратно в Windows (включая и тот опциональный, что касается тайлера, который мне ввести пришлось, например), и писать в доку «приватный модуль ду нот юзе». мне так кажется, по крайней мере.

Иван Денисов писал(а):
Ещё контроллер при вызове команды меню возможно и так вычислить без сканирования. А вот при вызове из компилятора, тут да — не обойтись без перебора.

изначально у меня так и было, через `.Focus()` в менюшной команде. почти хорошо, но всё равно каждый раз убирать руками маркеры перед компиляцией надоело, и пришлось допиливать перебор.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/