/[svn]/qsampler/trunk/src/qsamplerMessages.cpp
ViewVC logotype

Annotation of /qsampler/trunk/src/qsamplerMessages.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 115 - (hide annotations) (download)
Mon Jun 7 21:41:43 2004 UTC (19 years, 9 months ago) by capela
File size: 7118 byte(s)
* Comment SET CHANNEL MIDI_INPUT_PORT command from
  saveSessionFile(), it has no effect.

* Insert a n #include <unistd.h> on qsamplerMessages.h, between

* An initial non zero value (0.8) should be set for the channel
  volume, while GET CHANNEL INFO command is pending implementation.

* The order to load/save and setup channel settings is now as
  suggested in the following lines:

    SET CHANNEL AUDIO_OUTPUT_TYPE ...
    SET CHANNEL MIDI_INPUT_TYPE ...
    SET CHANNEL MIDI_INPUT_CHANNEL ...
    LOAD ENGINE ...
    LOAD INSTRUMENT ...
    SET CHANNEL VOLUME ...

1 capela 94 // qsamplerMessages.cpp
2     //
3     /****************************************************************************
4     Copyright (C) 2003-2004, rncbc aka Rui Nuno Capela. All rights reserved.
5    
6     This program is free software; you can redistribute it and/or
7     modify it under the terms of the GNU General Public License
8     as published by the Free Software Foundation; either version 2
9     of the License, or (at your option) any later version.
10    
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     GNU General Public License for more details.
15    
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19    
20     *****************************************************************************/
21    
22     #include "qsamplerMessages.h"
23    
24     #include <qsocketnotifier.h>
25     #include <qstringlist.h>
26     #include <qtextedit.h>
27     #include <qdatetime.h>
28     #include <qtooltip.h>
29     #include <qpixmap.h>
30    
31     #include "config.h"
32    
33 capela 115 #if !defined(WIN32)
34     #include <unistd.h>
35     #endif
36    
37 capela 94 // The default maximum number of message lines.
38     #define QSAMPLER_MESSAGES_MAXLINES 1000
39    
40     // Notification pipe descriptors
41     #define QSAMPLER_MESSAGES_FDNIL -1
42     #define QSAMPLER_MESSAGES_FDREAD 0
43     #define QSAMPLER_MESSAGES_FDWRITE 1
44    
45    
46     //-------------------------------------------------------------------------
47     // qsamplerMessages - Messages log dockable window.
48     //
49    
50     // Constructor.
51     qsamplerMessages::qsamplerMessages ( QWidget *pParent, const char *pszName )
52     : QDockWindow(pParent, pszName)
53     {
54     // Initialize default message limit.
55     m_iMessagesLimit = QSAMPLER_MESSAGES_MAXLINES;
56    
57     // Intialize stdout capture stuff.
58     m_pStdoutNotifier = NULL;
59     m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
60     m_fdStdout[QSAMPLER_MESSAGES_FDWRITE] = QSAMPLER_MESSAGES_FDNIL;
61    
62     // Surely a name is crucial (e.g.for storing geometry settings)
63     if (pszName == 0)
64     QDockWindow::setName("qsamplerMessages");
65    
66     // Create local text view widget.
67     m_pTextView = new QTextEdit(this);
68     // QFont font(m_pTextView->font());
69     // font.setFamily("Fixed");
70     // m_pTextView->setFont(font);
71     m_pTextView->setWordWrap(QTextEdit::NoWrap);
72     m_pTextView->setReadOnly(true);
73     m_pTextView->setUndoRedoEnabled(false);
74    
75     // Prepare the dockable window stuff.
76     QDockWindow::setWidget(m_pTextView);
77     QDockWindow::setOrientation(Qt::Horizontal);
78     QDockWindow::setCloseMode(QDockWindow::Always);
79     QDockWindow::setResizeEnabled(true);
80    
81     // Finally set the default caption and tooltip.
82     QString sCaption = tr("Messages");
83     QToolTip::add(this, sCaption);
84     QDockWindow::setCaption(sCaption);
85     }
86    
87    
88     // Destructor.
89     qsamplerMessages::~qsamplerMessages (void)
90     {
91     // No more notifications.
92     if (m_pStdoutNotifier)
93     delete m_pStdoutNotifier;
94    
95     // No need to delete child widgets, Qt does it all for us.
96     }
97    
98    
99     // Own stdout/stderr socket notifier slot.
100     void qsamplerMessages::stdoutNotify ( int fd )
101     {
102     #if !defined(WIN32)
103     char achBuffer[1024];
104     int cchBuffer = ::read(fd, achBuffer, sizeof(achBuffer) - 1);
105     if (cchBuffer > 0) {
106     achBuffer[cchBuffer] = (char) 0;
107     appendStdoutBuffer(achBuffer);
108     }
109     #endif
110     }
111    
112    
113     // Stdout buffer handler -- now splitted by complete new-lines...
114     void qsamplerMessages::appendStdoutBuffer ( const QString& s )
115     {
116     m_sStdoutBuffer.append(s);
117    
118     int iLength = m_sStdoutBuffer.findRev('\n') + 1;
119     if (iLength > 0) {
120     QString sTemp = m_sStdoutBuffer.left(iLength);
121     m_sStdoutBuffer.remove(0, iLength);
122     QStringList list = QStringList::split('\n', sTemp, true);
123     for (QStringList::Iterator iter = list.begin(); iter != list.end(); iter++)
124     appendMessagesText(*iter);
125     }
126     }
127    
128    
129     // Stdout flusher -- show up any unfinished line...
130     void qsamplerMessages::flushStdoutBuffer (void)
131     {
132     if (!m_sStdoutBuffer.isEmpty()) {
133     appendMessagesText(m_sStdoutBuffer);
134     m_sStdoutBuffer.truncate(0);
135     }
136     }
137    
138    
139     // Stdout capture accessors.
140     bool qsamplerMessages::isCaptureEnabled (void)
141     {
142     return (bool) (m_pStdoutNotifier != NULL);
143     }
144    
145     void qsamplerMessages::setCaptureEnabled ( bool bCapture )
146     {
147     // Flush current buffer.
148     flushStdoutBuffer();
149    
150     #if !defined(WIN32)
151     // Destroy if already enabled.
152     if (!bCapture && m_pStdoutNotifier) {
153     delete m_pStdoutNotifier;
154     m_pStdoutNotifier = NULL;
155     // Close the notification pipes.
156     if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {
157     ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
158     m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
159     }
160     if (m_fdStdout[QSAMPLER_MESSAGES_FDREAD] != QSAMPLER_MESSAGES_FDNIL) {
161     ::close(m_fdStdout[QSAMPLER_MESSAGES_FDREAD]);
162     m_fdStdout[QSAMPLER_MESSAGES_FDREAD] = QSAMPLER_MESSAGES_FDNIL;
163     }
164     }
165     // Are we going to make up the capture?
166     if (bCapture && m_pStdoutNotifier == NULL && ::pipe(m_fdStdout) == 0) {
167     ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDOUT_FILENO);
168     ::dup2(m_fdStdout[QSAMPLER_MESSAGES_FDWRITE], STDERR_FILENO);
169     m_pStdoutNotifier = new QSocketNotifier(m_fdStdout[QSAMPLER_MESSAGES_FDREAD], QSocketNotifier::Read, this);
170     QObject::connect(m_pStdoutNotifier, SIGNAL(activated(int)), this, SLOT(stdoutNotify(int)));
171     }
172     #endif
173     }
174    
175    
176     // Message font accessors.
177     QFont qsamplerMessages::messagesFont (void)
178     {
179     return m_pTextView->font();
180     }
181    
182     void qsamplerMessages::setMessagesFont( const QFont& font )
183     {
184     m_pTextView->setFont(font);
185     }
186    
187    
188     // Maximum number of message lines accessors.
189     int qsamplerMessages::messagesLimit (void)
190     {
191     return m_iMessagesLimit;
192     }
193    
194     void qsamplerMessages::setMessagesLimit ( int iMessagesLimit )
195     {
196     m_iMessagesLimit = iMessagesLimit;
197     }
198    
199    
200     // The main utility methods.
201     void qsamplerMessages::appendMessages ( const QString& s )
202     {
203     appendMessagesColor(s, "#999999");
204     }
205    
206     void qsamplerMessages::appendMessagesColor ( const QString& s, const QString &c )
207     {
208     appendMessagesText("<font color=\"" + c + "\">" + QTime::currentTime().toString("hh:mm:ss.zzz") + " " + s + "</font>");
209     }
210    
211     void qsamplerMessages::appendMessagesText ( const QString& s )
212     {
213     // Check for message line limit...
214     if (m_iMessagesLimit > 0) {
215     int iParagraphs = m_pTextView->paragraphs();
216     if (iParagraphs > m_iMessagesLimit) {
217     m_pTextView->setUpdatesEnabled(false);
218     while (iParagraphs > m_iMessagesLimit) {
219     m_pTextView->removeParagraph(0);
220     iParagraphs--;
221     }
222     m_pTextView->scrollToBottom();
223     m_pTextView->setUpdatesEnabled(true);
224     }
225     }
226     m_pTextView->append(s);
227     }
228    
229    
230     // One time scroll to the most recent message.
231     void qsamplerMessages::scrollToBottom (void)
232     {
233     flushStdoutBuffer();
234     m_pTextView->scrollToBottom();
235     }
236    
237    
238     // end of qsamplerMessages.cpp

  ViewVC Help
Powered by ViewVC