OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 21:26

Часовой пояс: UTC + 3 часа




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 22 Март, 2023 16:06 

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 23 Март, 2023 04:46 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
и, значится, быстрохак для `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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 23 Март, 2023 06:25 

Зарегистрирован: Суббота, 04 Май, 2019 10:21
Сообщения: 29
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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 23 Март, 2023 06:33 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
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!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 23 Март, 2023 06:37 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 23 Март, 2023 10:15 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
и это… если такой поисковик внедрить, то в `ConsWindows.Focus()` надо HALT закомментарить, а то консольный сборщик не будет работать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Март, 2023 22:10 
Аватара пользователя

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

commit 6a7968488d042300912f619cd364bbc7acd1e767


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Март, 2023 01:40 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
Иван Денисов писал(а):
В целом годно и без каких-то предсказуемых негативных последствий, так что "рацуха" принимается.
отлично, спасибо!

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

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB