comparison main/MainWindow.cpp @ 194:c851c49c79fe

* Make drop behave more sensibly (replace current pane)
author Chris Cannam
date Wed, 17 Oct 2007 12:58:45 +0000
parents 4e030ebb6b36
children 61bf55e80080
comparison
equal deleted inserted replaced
193:4e030ebb6b36 194:c851c49c79fe
2123 return; 2123 return;
2124 } 2124 }
2125 2125
2126 Model *prevPlaybackModel = m_viewManager->getPlaybackModel(); 2126 Model *prevPlaybackModel = m_viewManager->getPlaybackModel();
2127 2127
2128 std::set<Model *> soloModels; 2128 View::ModelSet soloModels = p->getModels();
2129 2129
2130 for (int i = 0; i < p->getLayerCount(); ++i) { 2130 for (View::ModelSet::iterator mi = soloModels.begin();
2131 Layer *layer = p->getLayer(i); 2131 mi != soloModels.end(); ++mi) {
2132 if (dynamic_cast<TimeRulerLayer *>(layer)) { 2132 if (dynamic_cast<RangeSummarisableTimeValueModel *>(*mi)) {
2133 continue; 2133 m_viewManager->setPlaybackModel(*mi);
2134 }
2135 if (layer && layer->getModel()) {
2136 Model *model = layer->getModel();
2137 if (dynamic_cast<RangeSummarisableTimeValueModel *>(model)) {
2138 m_viewManager->setPlaybackModel(model);
2139 }
2140 soloModels.insert(model);
2141 } 2134 }
2142 } 2135 }
2143 2136
2144 RangeSummarisableTimeValueModel *a = 2137 RangeSummarisableTimeValueModel *a =
2145 dynamic_cast<RangeSummarisableTimeValueModel *>(prevPlaybackModel); 2138 dynamic_cast<RangeSummarisableTimeValueModel *>(prevPlaybackModel);
3041 delete newModel; 3034 delete newModel;
3042 m_openingAudioFile = false; 3035 m_openingAudioFile = false;
3043 return FileOpenFailed; 3036 return FileOpenFailed;
3044 } 3037 }
3045 3038
3046 bool setAsMain = true;
3047 static bool prevSetAsMain = true;
3048
3049 bool realFile = (location == path); 3039 bool realFile = (location == path);
3050 3040
3051 if (mode == CreateAdditionalModel) setAsMain = false; 3041 std::cerr << "mode = " << mode << std::endl;
3052 else if (mode == AskUser) { 3042
3053 if (m_document->getMainModel()) { 3043 if (mode == AskUser) {
3054 3044 if (getMainModel()) {
3045
3046 std::cerr << "ask user, have main model" << std::endl;
3047
3048 static bool prevSetAsMain = true;
3049 bool setAsMain = true;
3050
3055 QStringList items; 3051 QStringList items;
3056 items << tr("Replace the existing main waveform") 3052 items << tr("Replace the existing main waveform")
3057 << tr("Load this file into a new waveform pane"); 3053 << tr("Load this file into a new waveform pane");
3058 3054
3059 bool ok = false; 3055 bool ok = false;
3068 return FileOpenCancelled; 3064 return FileOpenCancelled;
3069 } 3065 }
3070 3066
3071 setAsMain = (item == items[0]); 3067 setAsMain = (item == items[0]);
3072 prevSetAsMain = setAsMain; 3068 prevSetAsMain = setAsMain;
3073 } 3069
3074 } 3070 if (setAsMain) mode = ReplaceMainModel;
3075 3071 else mode = CreateAdditionalModel;
3076 if (setAsMain) { 3072
3073 } else {
3074 mode = ReplaceMainModel;
3075 }
3076 }
3077
3078 if (mode == ReplaceCurrentPane) {
3079
3080 std::cerr << "replace current pane" << std::endl;
3081
3082 Pane *pane = m_paneStack->getCurrentPane();
3083 if (pane) {
3084 std::cerr << "have pane" << std::endl;
3085
3086 if (getMainModel()) {
3087 std::cerr << "have main model" << std::endl;
3088
3089 View::ModelSet models(pane->getModels());
3090 if (models.find(getMainModel()) != models.end()) {
3091 std::cerr << "main model is in pane, setting to ReplaceMainModel" << std::endl;
3092 mode = ReplaceMainModel;
3093 }
3094 } else {
3095 std::cerr << "no main model, setting to ReplaceMainModel" << std::endl;
3096 mode = ReplaceMainModel;
3097 }
3098 } else {
3099 std::cerr << "no pane, setting to CreateAdditionalModel" << std::endl;
3100 mode = CreateAdditionalModel;
3101 }
3102 }
3103
3104 if (mode == CreateAdditionalModel && !getMainModel()) {
3105 std::cerr << "mode is CreateAdditionalModel and no main model, setting to ReplaceMainModel" << std::endl;
3106 mode = ReplaceMainModel;
3107 }
3108
3109 std::cerr << "mode now " << mode << std::endl;
3110
3111 if (mode == ReplaceMainModel) {
3077 3112
3078 Model *prevMain = getMainModel(); 3113 Model *prevMain = getMainModel();
3079 if (prevMain) { 3114 if (prevMain) {
3080 m_playSource->removeModel(prevMain); 3115 m_playSource->removeModel(prevMain);
3081 PlayParameterRepository::getInstance()->removeModel(prevMain); 3116 PlayParameterRepository::getInstance()->removeModel(prevMain);
3082 } 3117 }
3083
3084 PlayParameterRepository::getInstance()->addModel(newModel); 3118 PlayParameterRepository::getInstance()->addModel(newModel);
3085 3119
3086 m_document->setMainModel(newModel); 3120 m_document->setMainModel(newModel);
3087 setupMenus(); 3121 setupMenus();
3088 3122
3102 } 3136 }
3103 } 3137 }
3104 3138
3105 if (realFile) m_audioFile = path; 3139 if (realFile) m_audioFile = path;
3106 3140
3107 } else { // !setAsMain 3141 } else if (mode == CreateAdditionalModel) {
3108 3142
3109 CommandHistory::getInstance()->startCompoundOperation 3143 CommandHistory::getInstance()->startCompoundOperation
3110 (tr("Import \"%1\"").arg(QFileInfo(location).fileName()), true); 3144 (tr("Import \"%1\"").arg(QFileInfo(location).fileName()), true);
3111 3145
3112 m_document->addImportedModel(newModel); 3146 m_document->addImportedModel(newModel);
3120 m_timeRulerLayer = m_document->createMainModelLayer 3154 m_timeRulerLayer = m_document->createMainModelLayer
3121 (LayerFactory::TimeRuler); 3155 (LayerFactory::TimeRuler);
3122 } 3156 }
3123 3157
3124 m_document->addLayerToView(pane, m_timeRulerLayer); 3158 m_document->addLayerToView(pane, m_timeRulerLayer);
3159
3160 Layer *newLayer = m_document->createImportedLayer(newModel);
3161
3162 if (newLayer) {
3163 m_document->addLayerToView(pane, newLayer);
3164 }
3165
3166 CommandHistory::getInstance()->endCompoundOperation();
3167
3168 } else if (mode == ReplaceCurrentPane) {
3169
3170 // We know there is a current pane, otherwise we would have
3171 // reset the mode to CreateAdditionalModel above; and we know
3172 // the current pane does not contain the main model, otherwise
3173 // we would have reset it to ReplaceMainModel. But we don't
3174 // know whether the pane contains a waveform model at all.
3175
3176 Pane *pane = m_paneStack->getCurrentPane();
3177 Layer *replace = 0;
3178
3179 for (int i = 0; i < pane->getLayerCount(); ++i) {
3180 Layer *layer = pane->getLayer(i);
3181 if (dynamic_cast<WaveformLayer *>(layer)) {
3182 replace = layer;
3183 break;
3184 }
3185 }
3186
3187 CommandHistory::getInstance()->startCompoundOperation
3188 (tr("Import \"%1\"").arg(QFileInfo(location).fileName()), true);
3189
3190 m_document->addImportedModel(newModel);
3191
3192 if (replace) {
3193 m_document->removeLayerFromView(pane, replace);
3194 }
3125 3195
3126 Layer *newLayer = m_document->createImportedLayer(newModel); 3196 Layer *newLayer = m_document->createImportedLayer(newModel);
3127 3197
3128 if (newLayer) { 3198 if (newLayer) {
3129 m_document->addLayerToView(pane, newLayer); 3199 m_document->addLayerToView(pane, newLayer);
3605 { 3675 {
3606 if (pane) m_paneStack->setCurrentPane(pane); 3676 if (pane) m_paneStack->setCurrentPane(pane);
3607 3677
3608 for (QStringList::iterator i = uriList.begin(); i != uriList.end(); ++i) { 3678 for (QStringList::iterator i = uriList.begin(); i != uriList.end(); ++i) {
3609 3679
3610 FileOpenStatus status = 3680 FileOpenStatus status = openURL(*i, ReplaceCurrentPane);
3611 openURL(*i, (m_document->getMainModel() ?
3612 CreateAdditionalModel : ReplaceMainModel));
3613 3681
3614 if (status == FileOpenFailed) { 3682 if (status == FileOpenFailed) {
3615 QMessageBox::critical(this, tr("Failed to open dropped URL"), 3683 QMessageBox::critical(this, tr("Failed to open dropped URL"),
3616 tr("<b>Open failed</b><p>Dropped URL \"%1\" could not be opened").arg(*i)); 3684 tr("<b>Open failed</b><p>Dropped URL \"%1\" could not be opened").arg(*i));
3617 } else if (status == FileOpenWrongMode) { 3685 } else if (status == FileOpenWrongMode) {