Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Window запоминает свое предыдущее местрорасположение. (https://javascript.ru/forum/extjs/13174-window-zapominaet-svoe-predydushhee-mestroraspolozhenie.html)

cmygeHm 18.11.2010 18:11

Window запоминает свое предыдущее местрорасположение.
 
Традиционный привет всем!
Два вопроса:
1. Окно после закрытия (посл close, не после hide) и очередного открытия - открывается в том же месте экрана, где оно находилось когда его закрывали. Как сделать так чтобы оно открывалось в центре экрана?
2. В фаерфоксе (точнее в namaroka под kubuntu) если взять окно за title и потащить мышкой в самый верх экрана, то можно занести его аш за меню, так, что когда мышь отпустишь крестика на окне уже не видно. Хоть страницу снова обновляй. Как эту проблему можно решить?

ДЛЯ ТЕХ, КТО НЕ ХОЧЕТ ЧИТАТЬ ВЕСЬ ПОСТ. РЕШЕНИЕ ТАКОЕ:
constrainHeader: true, // окно не будет засовываться не известно куда
       stateful: false // окно не будет запоминать своего положения при закрытии

VKS 18.11.2010 21:00

Ты используешь Ext.state.Manager
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
   var win = new Window(...);
   win.restoreState();


Про фаерфокс под кубунту - не наю

cmygeHm 19.11.2010 09:03

Цитата:

Сообщение от VKS (Сообщение 79808)
Ты используешь Ext.state.Manager


Это вопрос? Или ответ ? :write:

Глянул что такое Ext.state.Manager, я его не использую. "Оно само срабатывает".

Вот ребята обсуждают: http://www.sencha.com/forum/showthre...indow&p=313320

Я только не понял, он предлагает добавить этот метод в сам класс?
Создал тему на их форуме, может ответят.

DooMer 22.11.2010 15:11

Цитата:

Сообщение от cmygeHm (Сообщение 79801)
2. В фаерфоксе (точнее в namaroka под kubuntu) если взять окно за title и потащить мышкой в самый верх экрана, то можно занести его аш за меню, так, что когда мышь отпустишь крестика на окне уже не видно. Хоть страницу снова обновляй. Как эту проблему можно решить?

// you window
{
   listeters:{
         move : function( w, x, y ){
                if(y > "за пределами экрана"){
                    w.setPosition(....);
                }
         }
   }
}

и еще, позиция окна сохраняется в куках...

cmygeHm 22.11.2010 15:28

спасибо. Я думал что может есть свойство какое. которое не разрешит затащить туда. а так - да, листенер - тоже выход из ситуации.спасибо.

cmygeHm 22.11.2010 17:54

Вложений: 1
Посмотрите на картинке, окно не просто залазит за края экрана, оно залазит за панель браузера. и тогда крестика не видно. и еще, посмотрел на в документации ExtJS, и не нашел там события move, у меня на такое событие вообще нет реакции у окна. :nono:

VKS 23.11.2010 10:43

move : ( Ext.Component this, Number x, Number y )
Fires after the component is moved.
Fires after the component is moved.
Listeners will be called with the following arguments:

    * this : Ext.Component
    * x : Number
      The new x position
    * y : Number
      The new y position


http://dev.sencha.com/deploy/dev/doc...Component-move

cmygeHm 26.11.2010 10:17

Спасибо, я сделал. Я не тому окну листенер добавил и сидел думал почему не срабатывает, отдыхать надо чаще:)

cmygeHm 29.11.2010 16:17

В общем создал свой класс окна, наследник Ext.Window и добавил ему соответствующие листенеры:
CenteredWindow = Ext.extend(Ext.Window, {

        initComponent: function(){
            Ext.applyIf(this, {
                resizable: false,
                listeners: {

                    move: function (w, x, y){
                        if (x<10 || (x+w.width)>GetWidth() || y<10 || y>GetHeight())
                        w.setPosition(GetWidth()/2-w.getWidth()/2, GetHeight()/2-w.getHeight()/2);
                    },
                    beforeshow: function(){
                        this.setPosition(GetWidth()/2-this.getWidth()/2, GetHeight()/2-this.getHeight()/2);
                    }
                }
           
            });

            CenteredWindow.superclass.initComponent.call(this);
        }
    });

function GetWidth()
{
      var x = 0;
      if (self.innerHeight)
      {
              x = self.innerWidth;
      }
      else if (document.documentElement && document.documentElement.clientHeight)
      {
              x = document.documentElement.clientWidth;
      }
      else if (document.body)
      {
              x = document.body.clientWidth;
      }
      return x;
}
function GetHeight()
{
      var y = 0;
      if (self.innerHeight)
      {
              y = self.innerHeight;
      }
      else if (document.documentElement && document.documentElement.clientHeight)
      {
              y = document.documentElement.clientHeight;
      }
      else if (document.body)
      {
              y = document.body.clientHeight;
      }
      return y;
}

Kolyaj 29.11.2010 16:23

Цитата:

Сообщение от cmygeHm
CenteredWindow.superclass.initComponent.call(this) ;

Здесь полезно писать всегда одинаковый шаблон
<ClassName>.superclass.<methodName>.apply(this, arguments);

В вашем случае
CenteredWindow.superclass.initComponent.apply(this, arguments);

Тогда не придётся задумываться, а ожидает ли перекрываемый метод какие-нибудь аргументы.

Если метод что-то возвращает, придётся задуматься :)

DooMer 29.11.2010 16:33

Кстати, рекомендую посмотреть как устроены Ext.MessageBox, их нельзя вытянуть вверх

cmygeHm 30.11.2010 09:40

я б залез да посмотрел:agree: , только ответьте на вопрос: у меня ext-библиотеки сжатые чтоли? там весь код в одну строку, ноги сломаешь туда лезть. Может мне надо девелопер-эдишен искать?

DooMer 30.11.2010 10:12

cmygeHm,
эм, там есть и не сжатые версии файлов, папка source помоему. Точно не скажу так как у меня 2+ версия

cmygeHm 30.11.2010 11:23

мессэйдж бокс и появляется всегда в середине. то что нужно прям.
в своем коде нашел баг, при создании экземпляра класса фаербаг дает too mush recursion. Вчера не было ошибки. Такая ... плавающая блин. Закомментил листенер beforeshow и работает без него.
Видимо что-то с this.... Кто-то куда-то не туда-то обращается при создании экземпляра...

Kolyaj 30.11.2010 11:26

Метод setPosition запускает событие move, обработчик события move вызывает setPosition, setPosition запускает событие move, ...

cmygeHm 30.11.2010 11:36

аааааааааааааа!!!!!!!!!!!!
(а в это время в голове: "Вот жопа!")

cmygeHm 30.11.2010 11:45

ext-all - не читабелен, сжат и т.п.
ext-all-debug - это в читабельном виде.
ext-all-debug-w-comments - догадайтесь сами.

DooMer 30.11.2010 12:12

cmygeHm,

constrainHeader:true

cmygeHm 30.11.2010 12:16

и stateful: false - для восстановления в середине браузера :)

Всем всем спасибо :dance:


Часовой пояс GMT +3, время: 05:43.