23 #include <QApplication>    27 #include <QTextStream>    28 #include <QMdiSubWindow>    29 #include <QStandardPaths>    31 #include <KLocalizedString>    54 #define CASE_COMMAND(x) } else if (parser.command() == _(x)) {    73      m_top_widget(Q_NULLPTR),
    74      m_main_widget(Q_NULLPTR),
    75      m_signal_manager(Q_NULLPTR),
    76      m_plugin_manager(Q_NULLPTR),
    79      m_last_playback_pos(0),
    80      m_last_status_message_text(),
    81      m_last_status_message_timer(),
    82      m_last_status_message_ms(0),
    83      m_last_undo(QString()),
    84      m_last_redo(QString()),
    86      m_delayed_command_timer(),
    87      m_delayed_command_queue()
   206     QFile menufile(QStandardPaths::locate(
   207         QStandardPaths::GenericDataLocation,
   208         _(
"kwave/menus.config")
   210     menufile.open(QIODevice::ReadOnly);
   211     QTextStream stream(&menufile);
   212     Q_ASSERT(!stream.atEnd());
   221         QApplication::restoreOverrideCursor();
   223             i18n(
"Kwave has not been properly installed. "\
   226         QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
   242                    old,              SLOT(showInSplashSreen(QString)));
   262                 top,              SLOT(showInSplashSreen(QString)));
   298                                         unsigned int param_count)
   301     if (parser.
count() != param_count) 
return -EINVAL;
   304     params.append(parser.
command());
   307     if (result > 0) result = 0;
   317     bool use_recorder = 
true;
   318     QString command = line;
   326     if (!command.length()) 
return 0; 
   327     if (command.trimmed().startsWith(
_(
"#")))
   335         foreach (
const QString &it, macro) {
   339                 qWarning(
"macro execution of '%s' failed: %d",
   351     if (command.startsWith(
_(
"nomacro:"))) {
   352         use_recorder = 
false;
   353         command = command.mid(QString(
_(
"nomacro:")).length());
   357     if (command.contains(
_(
"${"))) {
   359         if (command.contains(
_(
"${LANG}"))) {
   362             QString lang = locale.name().split(
_(
"-")).at(0);
   363             command.replace(
_(
"${LANG}"), lang);
   372     QString cmd = parser.
command();
   375     if (cmd == 
_(
"menu")) use_recorder = 
false;
   378     if (cmd == 
_(
"plugin")) use_recorder = 
false;
   382         (cmd == 
_(
"playback")) ||
   383         cmd.startsWith(
_(
"view:")) ||
   384         cmd.startsWith(
_(
"playback:")) ||
   385         cmd.startsWith(
_(
"select_track:")) ||
   386         (cmd == 
_(
"close")) ||
   387         (cmd == 
_(
"quit")) ||
   388         (cmd == 
_(
"window:screenshot")) ||
   389         (cmd == 
_(
"window:sendkey"))
   395         qWarning(
"FileContext::executeCommand('%s') - currently not possible, "   396                  "a plugin is running :-(",
   404         qDebug(
"# %s ", 
DBG(command));
   407     if ((result = 
m_top_widget->executeCommand(command)) != ENOSYS)
   414         if (parser.
count() != 2)
   416         unsigned int delay         = parser.
firstParam().toUInt();
   417         QString      delayed_cmd   = parser.
nextParam();
   425         qDebug(
"FileContext::executeCommand(): loading plugin '%s'", 
DBG(
name));
   426         qDebug(
"FileContext::executeCommand(): with %d parameter(s)",
   429             name, params.count() ? ¶ms : Q_NULLPTR);
   438         if (result > 0) result = 0;
   449             qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
   467         result = (layer_below) ? layer_below->
executeCommand(command) : -ENOSYS;
   501     if (!playing) 
return;
   506         double ms = 
static_cast<double>(offset) * 1E3 / rate;
   530         QList<int> existing_instances;
   532             const QString &
name = it.first;
   533             int            inst = it.second;
   534             if (name == our_name) existing_instances.append(inst);
   542         if (!existing_instances.isEmpty())
   609     if (context == 
this) {
   638             unsigned int remaining =
   676     QMap<QString, label_t> labels;
   679     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
   682     while (!stream.atEnd() && !result) {
   683         QString line = stream.readLine().simplified();
   684         if (line.startsWith(
_(
"#"))) 
continue; 
   685         if (!line.length()) 
continue;          
   687         if (line.endsWith(QLatin1Char(
':'))) {
   689             QString 
name = line.left(line.length() - 1).simplified();
   690             if (!labels.contains(name)) {
   693                 label_pos.
pos  = stream.pos();
   695                 labels[
name] = label_pos;
   699             if (label.length() && (label == 
name)) {
   709         if ( !label.length() &&
   710             (line.split(QLatin1Char(
' ')).at(0) == 
_(
"GOTO")) ) {
   711             label = line.split(QLatin1Char(
' ')).at(1).simplified();
   715         if (label.length()) {
   716             if (labels.contains(label)) {
   717                 labels[label].hits++;
   718                 qDebug(
">>> GOTO '%s' @ offset %llu (pass #%d)", 
DBG(label),
   722                 stream.seek(labels[label].pos);
   739             QApplication::restoreOverrideCursor();
   741                 parser.
firstParam()) == KMessageBox::Yes) ? 0 : 1;
   742             QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
   747         if (!line.startsWith(
_(
"nomacro:"), Qt::CaseInsensitive))
   748             line.prepend(
_(
"nomacro:"));
   756         if (current_ctx && (current_ctx != 
this))
   763         if (result == EAGAIN)
   767             qDebug(
">>> '%s' - result=%d", 
DBG(line), result);
   769         qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
   776         if (parser.
command() == 
_(
"quit")) {
   782     if (label.length()) {
   784         qWarning(
"label '%s' not found", 
DBG(label));
   789     QApplication::restoreOverrideCursor();
   796                                        const QString &command)
   801         QPair<unsigned int, QString>(delay, command)
   841     if (!name.length()) 
return QString();
   849                 "%1 = Name of the file, "   850                 "%2 = Instance number when opened multiple times",
   857             return i18nc(
"%1 = Path to modified file", 
"* %1 (modified)", name);
   868     QFile file(url.path());
   869     if (!file.open(QIODevice::ReadOnly)) {
   870         qWarning(
"unable to open source in read-only mode!");
   875     QTextStream stream(&file);
   892             i18n(
"This file has been modified, changes will be lost.\n"   893                  "Do you want to continue?"));
   894         if (res == KMessageBox::Cancel) 
return ECANCELED;
   914         if (res == -EINVAL) res = 
saveFileAs(QString(), 
false);
   925     QString 
name = filename;
   949                 QStringList extensions = encoder->
extensions(mime_type);
   950                 if (!extensions.isEmpty()) {
   951                     QString ext = extensions.first().split(
_(
" ")).first();
   954                         QString new_filename = current_url.fileName();
   955                         new_filename += extension.mid(1); 
   956                         current_url = current_url.adjusted(QUrl::RemoveFilename);
   957                         current_url.setPath(current_url.path() + new_filename);
   965             _(
"kfiledialog:///kwave_save_as"),
   970         dlg->setWindowTitle(i18n(
"Save As"));
   971         if (dlg->exec() != QDialog::Accepted) {
   982         QString new_name = url.path();
   983         QFileInfo path(new_name);
   986         if (!path.suffix().length()) {
   987             QString ext = dlg->selectedExtension();
   988             QStringList extensions = ext.split(
_(
" "));
   989             ext = extensions.first();
   990             new_name += ext.mid(1);
   992             url.setPath(new_name);
  1001     if ((url.toDisplayString() != QUrl(
signalName()).toDisplayString()) &&
  1002         (QFileInfo(name).exists()))
  1005             i18n(
"The file '%1' already exists.\n"  1006                  "Do you really want to overwrite it?", name)) !=
  1014     QString previous_mimetype_name =
  1020     if (new_mimetype_name != previous_mimetype_name) {
  1025         qDebug(
"TopWidget::saveAs(%s) - [%s] (previous:'%s')",
  1026             DBG(url.toDisplayString()), 
DBG(new_mimetype_name),
  1027             DBG(previous_mimetype_name) );
  1066         qWarning(
"FileContext::closeFile() - currently not possible, "\
  1067                  "a plugin is running :-(");
  1073             i18n(
"This file has been modified.\nDo you want to save it?"));
  1074         if (res == KMessageBox::Cancel) 
return false;
  1075         if (res == KMessageBox::Yes) {
  1078             qDebug(
"FileContext::closeFile()::saveFile, res=%d",res);
  1079             if (res) 
return false;
 static QString encodingFilter()
int loadBatch(const QUrl &url)
QPointer< Kwave::MainWidget > m_main_widget
QTimer m_delayed_command_timer
int parseCommands(QTextStream &stream)
void forwardZoomChanged(double zoom)
QString Q_DECL_EXPORT ms2string(double ms, int precision=6)
QString Q_DECL_EXPORT samples2string(sample_index_t samples)
QElapsedTimer m_last_status_message_timer
QList< QPair< unsigned int, QString > > m_delayed_command_queue
void enqueueCommand(unsigned int delay, const QString &command)
static void showMessage(const QString &message)
void setParent(Kwave::TopWidget *top_widget)
void sigMetaDataChanged(Kwave::MetaDataList meta_data)
void sigZoomChanged(Kwave::FileContext *context, double zoom)
static int questionYesNo(QWidget *widget, QString message, QString caption=QString(), const QString buttonYes=QString(), const QString buttonNo=QString(), const QString &dontAskAgainName=QString())
QList< FileAndInstance > openFiles() const
bool init(Kwave::TopWidget *top_widget)
static QString mimeTypeOf(const QUrl &url)
void sigVisibleRangeChanged(sample_index_t offset, sample_index_t visible, sample_index_t total)
void processDelayedCommand()
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
void metaDataChanged(Kwave::MetaDataList meta_data)
void set(FileProperty key, const QVariant &value)
QString windowCaption(bool with_modified) const
void selectionChanged(sample_index_t offset, sample_index_t length)
void statusBarMessage(const QString &msg, unsigned int ms)
static int error(QWidget *widget, QString message, QString caption=QString())
sample_index_t m_last_playback_pos
void setUndoRedoInfo(const QString &undo, const QString &redo)
QString signalName() const
bool hasMultipleCommands()
virtual void scrollTo(sample_index_t pos)=0
QStringList commandList()
bool createMainWidget(const QSize &preferred_size)
void sigStatusBarMessage(const QString &message, unsigned int ms)
static int warningYesNoCancel(QWidget *widget, QString message, QString caption=QString(), const QString buttonYes=QString(), const QString buttonNo=QString(), const QString &dontAskAgainName=QString())
static int warningYesNo(QWidget *widget, QString message, QString caption=QString(), const QString buttonYes=QString(), const QString buttonNo=QString(), const QString &dontAskAgainName=QString())
Kwave::Zoomable * zoomable() const
static int warningContinueCancel(QWidget *widget, QString message, QString caption=QString(), const QString buttonContinue=QString(), const QString buttonCancel=QString(), const QString &dontAskAgainName=QString())
QPointer< Kwave::PluginManager > m_plugin_manager
QPointer< Kwave::SignalManager > m_signal_manager
QWidget * mainWidget() const
static Kwave::Encoder * encoder(const QString &mimetype_name)
QString m_last_status_message_text
void updatePlaybackPos(sample_index_t offset)
const QString & firstParam()
void sigSelectionChanged(sample_index_t offset, sample_index_t length)
QStringList remainingParams()
QPair< QString, int > FileAndInstance
static void Q_DECL_EXPORT log(const QObject *sender, LogLevel level, const QString &msg)
void visibleRangeChanged(sample_index_t offset, sample_index_t visible, sample_index_t total)
Kwave::PluginManager * pluginManager() const
virtual int executeCommand(const QString &command)=0
Kwave::SignalManager * signalManager() const
unsigned int count() const
void addRecentFile(const QString &filename)
FileContext(Kwave::App &app)
virtual QStringList extensions(const QString &mimetype_name) const
unsigned int m_last_status_message_ms
int saveFileAs(const QString &filename, bool selection=false)
QPointer< Kwave::TopWidget > m_top_widget
Kwave::App & m_application
const QString & nextParam()
int executeCommand(const QString &command)
int delegateCommand(const char *plugin, Kwave::Parser &parser, unsigned int param_count)
void sigUndoRedoInfo(const QString &undo, const QString &redo)
void contextSwitched(Kwave::FileContext *context)