/[svn]/gigedit/trunk/src/gigedit/mainwindow.cpp
ViewVC logotype

Diff of /gigedit/trunk/src/gigedit/mainwindow.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2579 by persson, Sat May 24 06:44:39 2014 UTC revision 2610 by schoenebeck, Sun Jun 8 19:09:26 2014 UTC
# Line 45  Line 45 
45  #include "mainwindow.h"  #include "mainwindow.h"
46  #include "Settings.h"  #include "Settings.h"
47  #include "CombineInstrumentsDialog.h"  #include "CombineInstrumentsDialog.h"
48    #include "scripteditor.h"
49    #include "scriptslots.h"
50  #include "../../gfx/status_attached.xpm"  #include "../../gfx/status_attached.xpm"
51  #include "../../gfx/status_detached.xpm"  #include "../../gfx/status_detached.xpm"
52    
# Line 78  MainWindow::MainWindow() : Line 80  MainWindow::MainWindow() :
80      m_ScrolledWindowSamples.add(m_TreeViewSamples);      m_ScrolledWindowSamples.add(m_TreeViewSamples);
81      m_ScrolledWindowSamples.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);      m_ScrolledWindowSamples.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
82    
83        m_ScrolledWindowScripts.add(m_TreeViewScripts);
84        m_ScrolledWindowScripts.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
85    
86    
87      m_TreeViewNotebook.set_size_request(300);      m_TreeViewNotebook.set_size_request(300);
88    
# Line 98  MainWindow::MainWindow() : Line 103  MainWindow::MainWindow() :
103    
104      m_TreeViewNotebook.append_page(m_ScrolledWindowSamples, _("Samples"));      m_TreeViewNotebook.append_page(m_ScrolledWindowSamples, _("Samples"));
105      m_TreeViewNotebook.append_page(m_ScrolledWindow, _("Instruments"));      m_TreeViewNotebook.append_page(m_ScrolledWindow, _("Instruments"));
106        m_TreeViewNotebook.append_page(m_ScrolledWindowScripts, _("Scripts"));
107    
108      actionGroup = Gtk::ActionGroup::create();      actionGroup = Gtk::ActionGroup::create();
109    
# Line 130  MainWindow::MainWindow() : Line 135  MainWindow::MainWindow() :
135                       sigc::mem_fun(                       sigc::mem_fun(
136                           *this, &MainWindow::show_instr_props));                           *this, &MainWindow::show_instr_props));
137      actionGroup->add(Gtk::Action::create("MidiRules",      actionGroup->add(Gtk::Action::create("MidiRules",
138                                           _("_Midi Rules")),                                           _("_Midi Rules...")),
139                       sigc::mem_fun(                       sigc::mem_fun(
140                           *this, &MainWindow::show_midi_rules));                           *this, &MainWindow::show_midi_rules));
141        actionGroup->add(Gtk::Action::create("ScriptSlots",
142                                             _("_Script Slots...")),
143                         sigc::mem_fun(
144                             *this, &MainWindow::show_script_slots));
145      actionGroup->add(Gtk::Action::create("Quit", Gtk::Stock::QUIT),      actionGroup->add(Gtk::Action::create("Quit", Gtk::Stock::QUIT),
146                       sigc::mem_fun(                       sigc::mem_fun(
147                           *this, &MainWindow::on_action_quit));                           *this, &MainWindow::on_action_quit));
# Line 231  MainWindow::MainWindow() : Line 240  MainWindow::MainWindow() :
240                              _("Replace All Samples in All Groups...")),                              _("Replace All Samples in All Groups...")),
241          sigc::mem_fun(*this, &MainWindow::on_action_replace_all_samples_in_all_groups)          sigc::mem_fun(*this, &MainWindow::on_action_replace_all_samples_in_all_groups)
242      );      );
243        
244        // script right-click popup actions
245        actionGroup->add(
246            Gtk::Action::create("AddScriptGroup", _("Add _Group")),
247            sigc::mem_fun(*this, &MainWindow::on_action_add_script_group)
248        );
249        actionGroup->add(
250            Gtk::Action::create("AddScript", _("Add _Script")),
251            sigc::mem_fun(*this, &MainWindow::on_action_add_script)
252        );
253        actionGroup->add(
254            Gtk::Action::create("EditScript", _("_Edit Script...")),
255            sigc::mem_fun(*this, &MainWindow::on_action_edit_script)
256        );
257        actionGroup->add(
258            Gtk::Action::create("RemoveScript", Gtk::Stock::REMOVE),
259            sigc::mem_fun(*this, &MainWindow::on_action_remove_script)
260        );
261    
262      uiManager = Gtk::UIManager::create();      uiManager = Gtk::UIManager::create();
263      uiManager->insert_action_group(actionGroup);      uiManager->insert_action_group(actionGroup);
# Line 274  MainWindow::MainWindow() : Line 301  MainWindow::MainWindow() :
301          "  <popup name='PopupMenu'>"          "  <popup name='PopupMenu'>"
302          "    <menuitem action='InstrProperties'/>"          "    <menuitem action='InstrProperties'/>"
303          "    <menuitem action='MidiRules'/>"          "    <menuitem action='MidiRules'/>"
304            "    <menuitem action='ScriptSlots'/>"
305          "    <menuitem action='AddInstrument'/>"          "    <menuitem action='AddInstrument'/>"
306          "    <menuitem action='DupInstrument'/>"          "    <menuitem action='DupInstrument'/>"
307          "    <separator/>"          "    <separator/>"
# Line 287  MainWindow::MainWindow() : Line 315  MainWindow::MainWindow() :
315          "    <separator/>"          "    <separator/>"
316          "    <menuitem action='RemoveSample'/>"          "    <menuitem action='RemoveSample'/>"
317          "  </popup>"          "  </popup>"
318            "  <popup name='ScriptPopupMenu'>"
319            "    <menuitem action='AddScriptGroup'/>"
320            "    <menuitem action='AddScript'/>"
321            "    <menuitem action='EditScript'/>"
322            "    <separator/>"
323            "    <menuitem action='RemoveScript'/>"
324            "  </popup>"
325          "</ui>";          "</ui>";
326      uiManager->add_ui_from_string(ui_info);      uiManager->add_ui_from_string(ui_info);
327    
# Line 378  MainWindow::MainWindow() : Line 413  MainWindow::MainWindow() :
413          sigc::mem_fun(*this, &MainWindow::sample_name_changed)          sigc::mem_fun(*this, &MainWindow::sample_name_changed)
414      );      );
415    
416        // create scripts treeview (including its data model)
417        m_refScriptsTreeModel = ScriptsTreeStore::create(m_ScriptsModel);
418        m_TreeViewScripts.set_model(m_refScriptsTreeModel);
419        m_TreeViewScripts.set_tooltip_text(_(
420            "Note: instrument scripts are a LinuxSampler extension of the gig "
421            "format. This feature will not work with the GigaStudio software!"
422        ));
423        // m_TreeViewScripts.set_reorderable();
424        m_TreeViewScripts.append_column_editable("Samples", m_ScriptsModel.m_col_name);
425        m_TreeViewScripts.set_headers_visible(false);
426        m_TreeViewScripts.signal_button_press_event().connect_notify(
427            sigc::mem_fun(*this, &MainWindow::on_script_treeview_button_release)
428        );
429        m_refScriptsTreeModel->signal_row_changed().connect(
430            sigc::mem_fun(*this, &MainWindow::script_name_changed)
431        );
432    
433        // establish drag&drop between scripts tree view and ScriptSlots window
434        std::vector<Gtk::TargetEntry> drag_target_gig_script;
435        drag_target_gig_script.push_back(Gtk::TargetEntry("gig::Script"));
436        m_TreeViewScripts.drag_source_set(drag_target_gig_script);
437        m_TreeViewScripts.signal_drag_begin().connect(
438            sigc::mem_fun(*this, &MainWindow::on_scripts_treeview_drag_begin)
439        );
440        m_TreeViewScripts.signal_drag_data_get().connect(
441            sigc::mem_fun(*this, &MainWindow::on_scripts_treeview_drag_data_get)
442        );
443    
444      // establish drag&drop between samples tree view and dimension region 'Sample' text entry      // establish drag&drop between samples tree view and dimension region 'Sample' text entry
445      std::vector<Gtk::TargetEntry> drag_target_gig_sample;      std::vector<Gtk::TargetEntry> drag_target_gig_sample;
446      drag_target_gig_sample.push_back(Gtk::TargetEntry("gig::Sample"));      drag_target_gig_sample.push_back(Gtk::TargetEntry("gig::Sample"));
# Line 1342  void MainWindow::load_gig(gig::File* gig Line 1405  void MainWindow::load_gig(gig::File* gig
1405              }              }
1406          }          }
1407      }      }
1408        
1409        for (int i = 0; gig->GetScriptGroup(i); ++i) {
1410            gig::ScriptGroup* group = gig->GetScriptGroup(i);
1411    
1412            Gtk::TreeModel::iterator iterGroup = m_refScriptsTreeModel->append();
1413            Gtk::TreeModel::Row rowGroup = *iterGroup;
1414            rowGroup[m_ScriptsModel.m_col_name]   = gig_to_utf8(group->Name);
1415            rowGroup[m_ScriptsModel.m_col_group]  = group;
1416            rowGroup[m_ScriptsModel.m_col_script] = NULL;
1417            for (int s = 0; group->GetScript(s); ++s) {
1418                gig::Script* script = group->GetScript(s);
1419    
1420                Gtk::TreeModel::iterator iterScript =
1421                    m_refScriptsTreeModel->append(rowGroup.children());
1422                Gtk::TreeModel::Row rowScript = *iterScript;
1423                rowScript[m_ScriptsModel.m_col_name] = gig_to_utf8(script->Name);
1424                rowScript[m_ScriptsModel.m_col_script] = script;
1425                rowScript[m_ScriptsModel.m_col_group]  = NULL;
1426            }
1427        }
1428        // unfold all script groups by default
1429        m_TreeViewScripts.expand_all();
1430    
1431      file = gig;      file = gig;
1432    
# Line 1410  void MainWindow::show_midi_rules() Line 1495  void MainWindow::show_midi_rules()
1495      }      }
1496  }  }
1497    
1498    void MainWindow::show_script_slots() {
1499        if (!file) return;
1500        // get selected instrument
1501        Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeView.get_selection();
1502        Gtk::TreeModel::iterator it = sel->get_selected();
1503        if (!it) return;
1504        Gtk::TreeModel::Row row = *it;
1505        gig::Instrument* instrument = row[m_Columns.m_col_instr];
1506        if (!instrument) return;
1507    
1508        ScriptSlots* window = new ScriptSlots;
1509        window->setInstrument(instrument);
1510        //window->reparent(*this);
1511        window->show();
1512    }
1513    
1514  void MainWindow::on_action_view_status_bar() {  void MainWindow::on_action_view_status_bar() {
1515      Gtk::CheckMenuItem* item =      Gtk::CheckMenuItem* item =
1516          dynamic_cast<Gtk::CheckMenuItem*>(uiManager->get_widget("/MenuBar/MenuView/Statusbar"));          dynamic_cast<Gtk::CheckMenuItem*>(uiManager->get_widget("/MenuBar/MenuView/Statusbar"));
# Line 1506  void MainWindow::on_sample_treeview_butt Line 1607  void MainWindow::on_sample_treeview_butt
1607      }      }
1608  }  }
1609    
1610    void MainWindow::on_script_treeview_button_release(GdkEventButton* button) {
1611        if (button->type == GDK_BUTTON_PRESS && button->button == 3) {
1612            Gtk::Menu* script_popup =
1613                dynamic_cast<Gtk::Menu*>(uiManager->get_widget("/ScriptPopupMenu"));
1614            // update enabled/disabled state of sample popup items
1615            Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewScripts.get_selection();
1616            Gtk::TreeModel::iterator it = sel->get_selected();
1617            bool group_selected  = false;
1618            bool script_selected = false;
1619            if (it) {
1620                Gtk::TreeModel::Row row = *it;
1621                group_selected  = row[m_ScriptsModel.m_col_group];
1622                script_selected = row[m_ScriptsModel.m_col_script];
1623            }
1624            dynamic_cast<Gtk::MenuItem*>(uiManager->get_widget("/ScriptPopupMenu/AddScript"))->
1625                set_sensitive(group_selected || script_selected);
1626            dynamic_cast<Gtk::MenuItem*>(uiManager->get_widget("/ScriptPopupMenu/AddScriptGroup"))->
1627                set_sensitive(file);
1628            dynamic_cast<Gtk::MenuItem*>(uiManager->get_widget("/ScriptPopupMenu/EditScript"))->
1629                set_sensitive(script_selected);    
1630            dynamic_cast<Gtk::MenuItem*>(uiManager->get_widget("/ScriptPopupMenu/RemoveScript"))->
1631                set_sensitive(group_selected || script_selected);
1632            // show sample popup
1633            script_popup->popup(button->button, button->time);
1634        }
1635    }
1636    
1637  Gtk::RadioMenuItem* MainWindow::add_instrument_to_menu(  Gtk::RadioMenuItem* MainWindow::add_instrument_to_menu(
1638      const Glib::ustring& name, int position) {      const Glib::ustring& name, int position) {
# Line 1653  void MainWindow::on_action_sample_proper Line 1780  void MainWindow::on_action_sample_proper
1780      msg.run();      msg.run();
1781  }  }
1782    
1783    void MainWindow::on_action_add_script_group() {
1784        static int __script_indexer = 0;
1785        if (!file) return;
1786        gig::ScriptGroup* group = file->AddScriptGroup();
1787        group->Name = gig_from_utf8(_("Unnamed Group"));
1788        if (__script_indexer) group->Name += " " + ToString(__script_indexer);
1789        __script_indexer++;
1790        // update sample tree view
1791        Gtk::TreeModel::iterator iterGroup = m_refScriptsTreeModel->append();
1792        Gtk::TreeModel::Row rowGroup = *iterGroup;
1793        rowGroup[m_ScriptsModel.m_col_name] = gig_to_utf8(group->Name);
1794        rowGroup[m_ScriptsModel.m_col_script] = NULL;
1795        rowGroup[m_ScriptsModel.m_col_group] = group;
1796        file_changed();
1797    }
1798    
1799    void MainWindow::on_action_add_script() {
1800        if (!file) return;
1801        // get selected group
1802        Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewScripts.get_selection();
1803        Gtk::TreeModel::iterator it = sel->get_selected();
1804        if (!it) return;
1805        Gtk::TreeModel::Row row = *it;
1806        gig::ScriptGroup* group = row[m_ScriptsModel.m_col_group];
1807        if (!group) { // not a group, but a script is selected (probably)
1808            gig::Script* script = row[m_ScriptsModel.m_col_script];
1809            if (!script) return;
1810            it = row.parent(); // resolve parent (that is the script's group)
1811            if (!it) return;
1812            row = *it;
1813            group = row[m_ScriptsModel.m_col_group];
1814            if (!group) return;
1815        }
1816    
1817        // add a new script to the .gig file
1818        gig::Script* script = group->AddScript();    
1819        Glib::ustring name = _("Unnamed Script");
1820        script->Name = gig_from_utf8(name);
1821    
1822        // add script to the tree view
1823        Gtk::TreeModel::iterator iterScript =
1824            m_refScriptsTreeModel->append(row.children());
1825        Gtk::TreeModel::Row rowScript = *iterScript;
1826        rowScript[m_ScriptsModel.m_col_name] = name;
1827        rowScript[m_ScriptsModel.m_col_script] = script;
1828        rowScript[m_ScriptsModel.m_col_group]  = NULL;
1829    
1830        // unfold group of new script item in treeview
1831        Gtk::TreeModel::Path path(iterScript);
1832        m_TreeViewScripts.expand_to_path(path);
1833    }
1834    
1835    void MainWindow::on_action_edit_script() {
1836        if (!file) return;
1837        // get selected script
1838        Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewScripts.get_selection();
1839        Gtk::TreeModel::iterator it = sel->get_selected();
1840        if (!it) return;
1841        Gtk::TreeModel::Row row = *it;
1842        gig::Script* script = row[m_ScriptsModel.m_col_script];
1843        if (!script) return;
1844    
1845        ScriptEditor* editor = new ScriptEditor;
1846        editor->setScript(script);
1847        //editor->reparent(*this);
1848        editor->show();
1849    }
1850    
1851    void MainWindow::on_action_remove_script() {
1852        if (!file) return;
1853        Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewScripts.get_selection();
1854        Gtk::TreeModel::iterator it = sel->get_selected();
1855        if (it) {
1856            Gtk::TreeModel::Row row = *it;
1857            gig::ScriptGroup* group = row[m_ScriptsModel.m_col_group];
1858            gig::Script* script     = row[m_ScriptsModel.m_col_script];
1859            Glib::ustring name      = row[m_ScriptsModel.m_col_name];
1860            try {
1861                // remove script group or script from the gig file
1862                if (group) {
1863                    // notify everybody that we're going to remove these samples
1864    //TODO:         scripts_to_be_removed_signal.emit(members);
1865                    // delete the group in the .gig file including the
1866                    // samples that belong to the group
1867                    file->DeleteScriptGroup(group);
1868                    // notify that we're done with removal
1869    //TODO:         scripts_removed_signal.emit();
1870                    file_changed();
1871                } else if (script) {
1872                    // notify everybody that we're going to remove this sample
1873    //TODO:         std::list<gig::Script*> lscripts;
1874    //TODO:         lscripts.push_back(script);
1875    //TODO:         scripts_to_be_removed_signal.emit(lscripts);
1876                    // remove sample from the .gig file
1877                    script->GetGroup()->DeleteScript(script);
1878                    // notify that we're done with removal
1879    //TODO:         scripts_removed_signal.emit();
1880                    dimreg_changed();
1881                    file_changed();
1882                }
1883                // remove respective row(s) from samples tree view
1884                m_refScriptsTreeModel->erase(it);
1885            } catch (RIFF::Exception e) {
1886                // pretend we're done with removal (i.e. to avoid dead locks)
1887    //TODO:     scripts_removed_signal.emit();
1888                // show error message
1889                Gtk::MessageDialog msg(*this, e.Message.c_str(), false, Gtk::MESSAGE_ERROR);
1890                msg.run();
1891            }
1892        }
1893    }
1894    
1895  void MainWindow::on_action_add_group() {  void MainWindow::on_action_add_group() {
1896      static int __sample_indexer = 0;      static int __sample_indexer = 0;
1897      if (!file) return;      if (!file) return;
# Line 2022  void MainWindow::on_action_remove_sample Line 2261  void MainWindow::on_action_remove_sample
2261      }      }
2262  }  }
2263    
2264    // see comment on on_sample_treeview_drag_begin()
2265    void MainWindow::on_scripts_treeview_drag_begin(const Glib::RefPtr<Gdk::DragContext>& context)
2266    {
2267        first_call_to_drag_data_get = true;
2268    }
2269    
2270    void MainWindow::on_scripts_treeview_drag_data_get(const Glib::RefPtr<Gdk::DragContext>&,
2271                                                       Gtk::SelectionData& selection_data, guint, guint)
2272    {
2273        if (!first_call_to_drag_data_get) return;
2274        first_call_to_drag_data_get = false;
2275    
2276        // get selected script
2277        gig::Script* script = NULL;
2278        Glib::RefPtr<Gtk::TreeSelection> sel = m_TreeViewScripts.get_selection();
2279        Gtk::TreeModel::iterator it = sel->get_selected();
2280        if (it) {
2281            Gtk::TreeModel::Row row = *it;
2282            script = row[m_ScriptsModel.m_col_script];
2283        }
2284        // pass the gig::Script as pointer
2285        selection_data.set(selection_data.get_target(), 0/*unused*/,
2286                           (const guchar*)&script,
2287                           sizeof(script)/*length of data in bytes*/);
2288    }
2289    
2290  // For some reason drag_data_get gets called two times for each  // For some reason drag_data_get gets called two times for each
2291  // drag'n'drop (at least when target is an Entry). This work-around  // drag'n'drop (at least when target is an Entry). This work-around
2292  // makes sure the code in drag_data_get and drop_drag_data_received is  // makes sure the code in drag_data_get and drop_drag_data_received is
# Line 2148  void MainWindow::sample_name_changed(con Line 2413  void MainWindow::sample_name_changed(con
2413              file_changed();              file_changed();
2414          }          }
2415      }      }
2416    }
2417    
2418    void MainWindow::script_name_changed(const Gtk::TreeModel::Path& path,
2419                                         const Gtk::TreeModel::iterator& iter) {
2420        if (!iter) return;
2421        Gtk::TreeModel::Row row = *iter;
2422        Glib::ustring name      = row[m_ScriptsModel.m_col_name];
2423        gig::ScriptGroup* group = row[m_ScriptsModel.m_col_group];
2424        gig::Script* script     = row[m_ScriptsModel.m_col_script];
2425        gig::String gigname(gig_from_utf8(name));
2426        if (group) {
2427            if (group->Name != gigname) {
2428                group->Name = gigname;
2429                printf("script group name changed\n");
2430                file_changed();
2431            }
2432        } else if (script) {
2433            if (script->Name != gigname) {
2434                script->Name = gigname;
2435                printf("script name changed\n");
2436                file_changed();
2437            }
2438        }
2439  }  }
2440    
2441  void MainWindow::instrument_name_changed(const Gtk::TreeModel::Path& path,  void MainWindow::instrument_name_changed(const Gtk::TreeModel::Path& path,

Legend:
Removed from v.2579  
changed lines
  Added in v.2610

  ViewVC Help
Powered by ViewVC