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)