Revision
14494
Author
jmesquita
Date
2009-08-11 23:48:37 -0500 (Tue, 11 Aug 2009)

Log Message

Fix ListView scroll to non-blocking. Unfortunately we have to do delayed scrolling now...

Modified Paths

Diff

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/centralWidget.ui (14493 => 14494)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/centralWidget.ui	2009-08-12 04:11:33 UTC (rev 14493)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/centralWidget.ui	2009-08-12 04:48:37 UTC (rev 14494)
@@ -72,9 +72,16 @@
     <addaction name="action_Clear"/>
     <addaction name="separator"/>
    </widget>
+   <widget class="QMenu" name="menu_Console">
+    <property name="title">
+     <string>&amp;Console</string>
+    </property>
+    <addaction name="actionAutomatic_Scroll"/>
+   </widget>
    <addaction name="menu_File"/>
    <addaction name="menu_Edit"/>
    <addaction name="menu_Server"/>
+   <addaction name="menu_Console"/>
   </widget>
   <widget class="QStatusBar" name="statusbar"/>
   <action name="action_Connect">
@@ -111,6 +118,17 @@
     <string>&amp;Clear</string>
    </property>
   </action>
+  <action name="actionAutomatic_Scroll">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="checked">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>&amp;Automatic Scroll</string>
+   </property>
+  </action>
  </widget>
  <resources>
   <include location="../../resources/resources.qrc"/>

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.cpp (14493 => 14494)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.cpp	2009-08-12 04:11:33 UTC (rev 14493)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.cpp	2009-08-12 04:48:37 UTC (rev 14494)
@@ -27,6 +27,8 @@
                      this, SLOT(disconnect()));
     QObject::connect(consoleWindow->action_Clear, SIGNAL(triggered()),
                      this, SLOT(clearLogContents()));
+    QObject::connect(consoleWindow->actionAutomatic_Scroll, SIGNAL(toggled(bool)),
+                     this, SLOT(setAutoScroll(bool)));
 }
 
 ConsolePlugin::~ConsolePlugin(){}
@@ -396,29 +398,44 @@
 void ConsolePlugin::tabChanged(int index)
 {
     ESLconnection *esl = hashESL.value(consoleWindow->tabConsole->tabText(index), NULL);
+    ConsoleTabWidget *tab = qobject_cast<ConsoleTabWidget *>(consoleWindow->tabConsole->currentWidget());
     if (esl)
     {
         consoleWindow->action_Connect->setDisabled(esl->isConnected());
         consoleWindow->action_Disconnect->setEnabled(esl->isConnected());
+        consoleWindow->actionAutomatic_Scroll->setChecked(tab->getAutomaticScroll());
+        consoleWindow->actionAutomatic_Scroll->setEnabled(esl->isConnected());
+        tab->flipScrollTimer();
     }
 }
 
 void ConsolePlugin::connect()
 {
     ESLconnection *esl = hashESL.value(consoleWindow->tabConsole->tabText(consoleWindow->tabConsole->currentIndex()), NULL);
+    ConsoleTabWidget *tab = qobject_cast<ConsoleTabWidget *>(consoleWindow->tabConsole->currentWidget());
     if (esl)
     {
         esl->connect();
+        tab->flipScrollTimer();
     }
 }
 
 void ConsolePlugin::disconnect()
 {
     ESLconnection *esl = hashESL.value(consoleWindow->tabConsole->tabText(consoleWindow->tabConsole->currentIndex()), NULL);
+    ConsoleTabWidget *tab = qobject_cast<ConsoleTabWidget *>(consoleWindow->tabConsole->currentWidget());
     if (esl)
     {
         esl->disconnect();
+        tab->flipScrollTimer();
     }
 }
 
+void ConsolePlugin::setAutoScroll(bool checked)
+{
+    ConsoleTabWidget *tab = qobject_cast<ConsoleTabWidget *>(consoleWindow->tabConsole->currentWidget());
+    tab->setAutomaticScroll(checked);
+    tab->flipScrollTimer();
+}
+
 Q_EXPORT_PLUGIN2(consoleplugin, ConsolePlugin)

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.h (14493 => 14494)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.h	2009-08-12 04:11:33 UTC (rev 14493)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.h	2009-08-12 04:48:37 UTC (rev 14494)
@@ -51,6 +51,7 @@
     void changeDebugForegroundColor();
     void tabClose(int index);
     void tabChanged(int index);
+    void setAutoScroll(bool checked);
     void readSettings();
     void writeSettings();
 

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.cpp (14493 => 14494)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.cpp	2009-08-12 04:11:33 UTC (rev 14493)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.cpp	2009-08-12 04:48:37 UTC (rev 14494)
@@ -6,7 +6,9 @@
     QWidget(parent),
     m_ui(new Ui::ConsoleTabWidget),
     esl(eslconnection),
-    findNext(false)
+    scrollTimer(new QTimer),
+    findNext(false),
+    autoScroll(true)
 {
     m_ui->setupUi(this);
     sourceModel = new QStandardItemModel(this);
@@ -48,6 +50,9 @@
     QObject::connect(esl, SIGNAL(gotEvent(ESLevent*)),
                      this, SLOT(gotEvent(ESLevent*)));
 
+    QObject::connect(scrollTimer, SIGNAL(timeout()),
+                     this, SLOT(conditionalScroll()));
+
     esl->connect();
 }
 
@@ -73,6 +78,38 @@
     }
 }
 
+void ConsoleTabWidget::flipScrollTimer()
+{
+    if (!esl->isConnected())
+    {
+        scrollTimer->stop();
+        return;
+    }
+
+    if (scrollTimer->isActive())
+        scrollTimer->stop();
+    else if (autoScroll)
+        scrollTimer->start(500);
+}
+
+void ConsoleTabWidget::setAutomaticScroll(bool enabled)
+{
+    qDebug() << "setAutomaticScroll to:" << enabled;
+    autoScroll = enabled;
+}
+
+bool ConsoleTabWidget::getAutomaticScroll()
+{
+    return autoScroll;
+}
+
+void ConsoleTabWidget::conditionalScroll()
+{
+    //if (m_ui->consoleListView->verticalScrollBar()->value() == m_ui->consoleListView->verticalScrollBar()->maximum())
+    qDebug() << "Asked to scroll!";
+    m_ui->consoleListView->scrollToBottom();
+}
+
 void ConsoleTabWidget::find()
 {
     if (m_ui->lineFind->text().isEmpty())
@@ -155,12 +192,8 @@
         for (int line = 0; line<textList.size(); line++)
         {
             final_str += textList[line];
-            if (line == textList.size()-1)
-            {
-                final_str.chop(1);
-            }
         }
-        QStringList lines = final_str.split('\n', QString::SkipEmptyParts);
+        QStringList lines = final_str.split(QRegExp("(\n+)"), QString::SkipEmptyParts);
         for (int line = 0; line < lines.size(); ++line)
         {
             QStandardItem *item = new QStandardItem(lines[line]);
@@ -178,15 +211,7 @@
     QPalette palette = settings.value(QString("log-level-%1-palette").arg(item->data(Qt::UserRole).toInt())).value<QPalette>();
     item->setBackground(palette.base());
     item->setForeground(palette.text());
-    if (m_ui->consoleListView->verticalScrollBar()->value() == m_ui->consoleListView->verticalScrollBar()->maximum())
-    {
-        sourceModel->appendRow(item);
-        m_ui->consoleListView->scrollToBottom();
-    }
-    else
-    {
-        sourceModel->appendRow(item);
-    }
+    sourceModel->appendRow(item);
 }
 
 void ConsoleTabWidget::cmdSendClicked()

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.h (14493 => 14494)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.h	2009-08-12 04:11:33 UTC (rev 14493)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.h	2009-08-12 04:48:37 UTC (rev 14494)
@@ -10,6 +10,7 @@
 
 class QStandardItem;
 class QStandardItemModel;
+class QTimer;
 class ESLconnection;
 class ESLevent;
 
@@ -21,11 +22,15 @@
 
 public slots:
     void clearConsoleContents();
+    void flipScrollTimer();
+    void setAutomaticScroll(bool enabled);
+    bool getAutomaticScroll();
 
 protected:
     void changeEvent(QEvent *e);
 
 private slots:
+    void conditionalScroll();
     void find();
     void findStringChanged(QString);
     void connected();
@@ -49,7 +54,10 @@
     QModelIndexList foundItems;
     SortFilterProxyModel *model;
     ESLconnection *esl;
+    QTimer *scrollTimer;
     bool findNext;
+    bool autoScroll;
+
 };
 
 #endif // CONSOLETABWIDGET_H

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.ui (14493 => 14494)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.ui	2009-08-12 04:11:33 UTC (rev 14493)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.ui	2009-08-12 04:48:37 UTC (rev 14494)
@@ -19,6 +19,12 @@
      <property name="title">
       <string>Find</string>
      </property>
+     <property name="flat">
+      <bool>false</bool>
+     </property>
+     <property name="checkable">
+      <bool>false</bool>
+     </property>
      <layout class="QHBoxLayout" name="horizontalLayout_3">
       <item>
        <widget class="QLineEdit" name="lineFind"/>
@@ -43,7 +49,17 @@
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_2">
      <item>
-      <widget class="QListView" name="consoleListView"/>
+      <widget class="QListView" name="consoleListView">
+       <property name="editTriggers">
+        <set>QAbstractItemView::NoEditTriggers</set>
+       </property>
+       <property name="selectionMode">
+        <enum>QAbstractItemView::ExtendedSelection</enum>
+       </property>
+       <property name="layoutMode">
+        <enum>QListView::SinglePass</enum>
+       </property>
+      </widget>
      </item>
      <item>
       <widget class="QGroupBox" name="groupBox">