[Summary] Progressing UI

This commit is contained in:
VKamyshniy 2014-07-28 11:06:02 +03:00
parent 4f23e1d56a
commit f2251dd1c2
24 changed files with 665 additions and 255 deletions

View file

@ -251,7 +251,6 @@ Editor::Editor ()
, editor_summary_pane (get_v_paned ("editor_summary_pane"))
, inspector_home (get_container ("inspector_home"))
, _master_bus_ui_home (get_container ("master_bus_ui_home"))
, _compact_meter_bridge_home (get_container ("compact_meter_bridge_home"))
, vpacker (get_v_box ("vpacker"))
, _tool_marker_button (get_waves_button ("tool_marker_button"))
, _tool_zoom_button (get_waves_button ("tool_zoom_button"))
@ -315,7 +314,8 @@ Editor::Editor ()
/* we are a singleton */
PublicEditor::_instance = this;
_compact_meter_bridge_home.add (_compact_meter_bridge);
get_container ("compact_meter_bridge_home").add (_compact_meter_bridge);
get_container ("mixer_bridge_view_home").add (_mixer_bridge_view);
_have_idled = false;
@ -1281,6 +1281,7 @@ Editor::set_session (Session *t)
_routes->set_session (_session);
_locations->set_session (_session);
_compact_meter_bridge.set_session (_session);
_mixer_bridge_view.set_session (_session);
if (rhythm_ferret) {
rhythm_ferret->set_session (_session);

View file

@ -58,6 +58,7 @@
#include "editor_items.h"
#include "region_selection.h"
#include "compact_meter_bridge.h"
#include "mixer_bridge_view.h"
namespace Gtkmm2ext {
class TearOff;
@ -688,7 +689,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
Gtk::Container& inspector_home;
Gtk::Container& _master_bus_ui_home;
Gtk::Container& _compact_meter_bridge_home;
MasterBusUI* _master_bus_ui;
Gtk::VBox& vpacker;
@ -1901,6 +1901,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
MixerStrip *current_mixer_strip;
CompactMeterbridge _compact_meter_bridge;
MixerBridgeView _mixer_bridge_view;
bool show_editor_mixer_when_tracks_arrive;
void cms_new (boost::shared_ptr<ARDOUR::Route>);
void current_mixer_strip_hidden ();

View file

@ -255,6 +255,7 @@ void
Editor::track_mixer_selection ()
{
Mixer_UI::instance()->selection().RoutesChanged.connect (sigc::mem_fun (*this, &Editor::follow_mixer_selection));
_mixer_bridge_view.track_editor_selection ();
}
void

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 276 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 B

After

Width:  |  Height:  |  Size: 201 B

Before After
Before After

View file

@ -0,0 +1,411 @@
/*
Copyright (C) 2014 Waves Audio Ltd.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifdef WAF_BUILD
#include "gtk2ardour-config.h"
#endif
#include <map>
#include <sigc++/bind.h>
#include <gtkmm/accelmap.h>
#include <glibmm/threads.h>
#include <gtkmm2ext/gtk_ui.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/window_title.h>
#include "ardour/debug.h"
#include "ardour/midi_track.h"
#include "ardour/route_group.h"
#include "ardour/session.h"
#include "ardour/audio_track.h"
#include "ardour/midi_track.h"
#include "mixer_bridge_view.h"
#include "keyboard.h"
#include "monitor_section.h"
#include "public_editor.h"
#include "ardour_ui.h"
#include "utils.h"
#include "route_sorter.h"
#include "actions.h"
#include "gui_thread.h"
#include "global_signals.h"
#include "meter_patterns.h"
#include "i18n.h"
using namespace ARDOUR;
using namespace PBD;
using namespace Gtk;
using namespace Glib;
using namespace Gtkmm2ext;
using namespace std;
using namespace ArdourMeter;
using PBD::atoi;
struct SignalOrderRouteSorter {
bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
if (a->is_master() || a->is_monitor()) {
/* "a" is a special route (master, monitor, etc), and comes
* last in the mixer ordering
*/
return false;
} else if (b->is_master() || b->is_monitor()) {
/* everything comes before b */
return true;
}
return a->order_key () < b->order_key ();
}
};
MixerBridgeView::MixerBridgeView ()
: Gtk::EventBox()
, WavesUI ("mixer_bridge_view.xml", *this)
, _mixer_strips_home (get_box ("mixer_strips_home"))
, _following_editor_selection (false)
{
set_attributes (*this, *xml_tree ()->root (), XMLNodeMap ());
signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&MixerBridgeView::sync_order_keys, this), gui_context());
MixerStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&MixerBridgeView::remove_strip, this, _1), gui_context());
}
MixerBridgeView::~MixerBridgeView ()
{
}
void
MixerBridgeView::set_session (Session* s)
{
SessionHandlePtr::set_session (s);
if (!_session) {
return;
}
boost::shared_ptr<RouteList> routes = _session->get_routes();
add_strips(*routes);
_session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&MixerBridgeView::add_strips, this, _1), gui_context());
start_updating ();
}
void
MixerBridgeView::track_editor_selection ()
{
PublicEditor::instance().get_selection().TracksChanged.connect (sigc::mem_fun (*this, &MixerBridgeView::follow_editor_selection));
}
void
MixerBridgeView::session_going_away ()
{
ENSURE_GUI_THREAD (*this, &MixerBridgeView::session_going_away);
for (std::map <boost::shared_ptr<ARDOUR::Route>, MixerStrip*>::iterator i = _strips.begin(); i != _strips.end(); ++i) {
delete (*i).second;
}
_strips.clear ();
stop_updating ();
SessionHandlePtr::session_going_away ();
_session = 0;
}
gint
MixerBridgeView::start_updating ()
{
fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun(*this, &MixerBridgeView::fast_update_strips));
return 0;
}
gint
MixerBridgeView::stop_updating ()
{
fast_screen_update_connection.disconnect();
return 0;
}
void
MixerBridgeView::fast_update_strips ()
{
if (!is_mapped () || !_session) {
return;
}
for (std::map <boost::shared_ptr<ARDOUR::Route>, MixerStrip*>::iterator i = _strips.begin(); i != _strips.end(); ++i) {
(*i).second->fast_update ();
}
}
void
MixerBridgeView::add_strips (RouteList& routes)
{
// First detach all the prviously added strips from the ui tree.
for (std::map<boost::shared_ptr<ARDOUR::Route>, MixerStrip*>::iterator i = _strips.begin(); i != _strips.end(); ++i) {
_mixer_strips_home.remove (*(*i).second); // we suppose _mixer_strips_home is
// the parnet.
}
// Now create the strips for newly added routes
for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
boost::shared_ptr<Route> route = (*x);
if (route->is_auditioner() || route->is_monitor() || route->is_master()) {
continue;
}
MixerStrip* strip = strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), _session, route, "mixer_strip.xml");
strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &MixerBridgeView::strip_button_release_event), strip));
_strips [route] = strip;
strip->show();
}
// Now sort the session's routes and pack the strips accordingly
SignalOrderRouteSorter sorter;
RouteList copy(*_session->get_routes());
copy.sort(sorter);
for (RouteList::iterator x = copy.begin(); x != copy.end(); ++x) {
boost::shared_ptr<Route> route = (*x);
if (route->is_auditioner() || route->is_monitor() || route->is_master()) {
continue;
}
std::map <boost::shared_ptr<ARDOUR::Route>, MixerStrip*>::iterator i = _strips.find (route);
if (i != _strips.end ()) {
_mixer_strips_home.pack_start (*(*i).second, false, false);
}
}
}
void
MixerBridgeView::remove_strip (MixerStrip* strip)
{
if (_session && _session->deletion_in_progress()) {
return;
}
boost::shared_ptr<ARDOUR::Route> route = strip->route ();
std::map <boost::shared_ptr<ARDOUR::Route>, MixerStrip*>::iterator i = _strips.find (route);
if (i != _strips.end ()) {
_strips.erase (i);
}
}
void
MixerBridgeView::sync_order_keys ()
{
Glib::Threads::Mutex::Lock lm (_resync_mutex);
if (!_session) {
return;
}
SignalOrderRouteSorter sorter;
boost::shared_ptr<RouteList> routes = _session->get_routes();
for (std::map<boost::shared_ptr<ARDOUR::Route>, MixerStrip*>::iterator i = _strips.begin(); i != _strips.end(); ++i) {
_mixer_strips_home.remove (*(*i).second); // we suppose _mixer_strips_home is
// the parnet.
}
RouteList copy(*routes);
copy.sort(sorter);
for (RouteList::iterator x = copy.begin(); x != copy.end(); ++x) {
boost::shared_ptr<Route> route = (*x);
if (route->is_auditioner() || route->is_monitor() || route->is_master()) {
continue;
}
std::map <boost::shared_ptr<ARDOUR::Route>, MixerStrip*>::iterator i = _strips.find (route);
if (i != _strips.end ()) {
_mixer_strips_home.pack_start (*(*i).second, false, false);
}
}
}
void
MixerBridgeView::follow_editor_selection ()
{
if (_following_editor_selection) {
return;
}
_following_editor_selection = true;
_selection.block_routes_changed (true);
TrackSelection& s (PublicEditor::instance().get_selection().tracks);
_selection.clear_routes ();
for (TrackViewList::iterator i = s.begin(); i != s.end(); ++i) {
RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*i);
if (rtav) {
MixerStrip* ms = strip_by_route (rtav->route());
if (ms) {
_selection.add (ms);
}
}
}
_following_editor_selection = false;
_selection.block_routes_changed (false);
}
void
MixerBridgeView::set_route_targets_for_operation ()
{
_route_targets.clear ();
if (!_selection.empty()) {
_route_targets = _selection.routes;
return;
}
/* nothing selected ... try to get mixer strip at mouse */
int x, y;
get_pointer (x, y);
MixerStrip* ms = strip_by_x (x);
if (ms) {
_route_targets.insert (ms);
}
}
void
MixerBridgeView::toggle_midi_input_active (bool flip_others)
{
boost::shared_ptr<RouteList> rl (new RouteList);
bool onoff = false;
set_route_targets_for_operation ();
for (RouteUISelection::iterator r = _route_targets.begin(); r != _route_targets.end(); ++r) {
boost::shared_ptr<MidiTrack> mt = (*r)->midi_track();
if (mt) {
rl->push_back ((*r)->route());
onoff = !mt->input_active();
}
}
_session->set_exclusive_input_active (rl, onoff, flip_others);
}
bool
MixerBridgeView::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
{
if (ev->button == 1) {
if (_selection.selected (strip)) {
/* primary-click: toggle selection state of strip */
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
_selection.remove (strip);
}
} else {
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
_selection.add (strip);
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::RangeSelectModifier)) {
if (!_selection.selected(strip)) {
/* extend selection */
vector<MixerStrip*> tmp;
bool accumulate = false;
tmp.push_back (strip);
for (std::map<boost::shared_ptr<ARDOUR::Route>, MixerStrip*>::iterator i = _strips.begin(); i != _strips.end(); ++i) {
if ((*i).second == strip) {
/* hit clicked strip, start accumulating till we hit the first
selected strip
*/
if (accumulate) {
/* done */
break;
} else {
accumulate = true;
}
} else if (_selection.selected ((*i).second)) {
/* hit selected strip. if currently accumulating others,
we're done. if not accumulating others, start doing so.
*/
if (accumulate) {
/* done */
break;
} else {
accumulate = true;
}
} else {
if (accumulate) {
tmp.push_back ((*i).second);
}
}
}
for (vector<MixerStrip*>::iterator i = tmp.begin(); i != tmp.end(); ++i) {
_selection.add (*i);
}
}
} else {
_selection.set (strip);
}
}
}
return true;
}
MixerStrip*
MixerBridgeView::strip_by_route (boost::shared_ptr<Route> route)
{
std::map <boost::shared_ptr<ARDOUR::Route>, MixerStrip*>::iterator i = _strips.find (route);
if (i != _strips.end ()) {
return (*i).second;
}
return 0;
}
MixerStrip*
MixerBridgeView::strip_by_x (int x)
{
for (std::map<boost::shared_ptr<ARDOUR::Route>, MixerStrip*>::iterator i = _strips.begin(); i != _strips.end(); ++i) {
int x1, x2, y;
(*i).second->translate_coordinates (*this, 0, 0, x1, y);
x2 = x1 + (*i).second->get_width();
if (x >= x1 && x <= x2) {
return (*i).second;
}
}
return 0;
}

View file

@ -0,0 +1,83 @@
/*
Copyright (C) 2014 Waves Audio Ltd.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __ardour_mixer_bridge_view_h__
#define __ardour_mixer_bridge_view_h__
#include <glibmm/thread.h>
#include <gtkmm/box.h>
#include <gtkmm/scrolledwindow.h>
#include <gtkmm/label.h>
#include <gtkmm/window.h>
#include "ardour/ardour.h"
#include "ardour/types.h"
#include "ardour/session_handle.h"
#include "pbd/stateful.h"
#include "pbd/signals.h"
#include "gtkmm2ext/visibility_tracker.h"
#include "waves_ui.h"
#include "mixer_strip.h"
#include "mixer_actor.h"
class MixerBridgeView :
public Gtk::EventBox,
public WavesUI,
public PBD::ScopedConnectionList,
public ARDOUR::SessionHandlePtr,
public MixerActor
{
public:
MixerBridgeView ();
~MixerBridgeView();
void set_session (ARDOUR::Session *);
void track_editor_selection ();
protected:
void set_route_targets_for_operation ();
void toggle_midi_input_active (bool flip_others);
private:
Gtk::Box& _mixer_strips_home;
bool _following_editor_selection;
gint start_updating ();
gint stop_updating ();
sigc::connection fast_screen_update_connection;
void fast_update_strips ();
void add_strips (ARDOUR::RouteList&);
void remove_strip (MixerStrip *);
void session_going_away ();
void sync_order_keys ();
void follow_editor_selection ();
bool strip_button_release_event (GdkEventButton*, MixerStrip*);
MixerStrip* strip_by_route (boost::shared_ptr<ARDOUR::Route> route);
MixerStrip* strip_by_x (int x);
std::map <boost::shared_ptr<ARDOUR::Route>, MixerStrip*> _strips;
mutable Glib::Threads::Mutex _resync_mutex;
};
#endif //__ardour_mixer_bridge_view_h__

View file

@ -105,20 +105,18 @@ MonoPanner::set_tooltip ()
_tooltip.set_tip (buf);
}
bool
MonoPanner::on_expose_event (GdkEventExpose*)
void
MonoPanner::render (cairo_t* cr)
{
Cairo::RefPtr<Cairo::Context> context = get_window()->create_cairo_context();
unsigned pos = (unsigned)(rint (100.0 * position_control->get_value ())); /* 0..100 */
double x = (get_width() - _knob_image[pos]->get_width())/2.0;
double y = (get_height() - _knob_image[pos]->get_height())/2.0;
cairo_rectangle (context->cobj(), x, y, _knob_image[pos]->get_width(), _knob_image[pos]->get_height());
cairo_rectangle (cr, x, y, _knob_image[pos]->get_width(), _knob_image[pos]->get_height());
gdk_cairo_set_source_pixbuf (context->cobj(), _knob_image[pos]->gobj(), x, y);
cairo_fill (context->cobj());
return true;
gdk_cairo_set_source_pixbuf (cr, _knob_image[pos]->gobj(), x, y);
cairo_fill (cr);
}
bool

View file

@ -48,7 +48,7 @@ class MonoPanner : public PannerInterface
sigc::signal<void> StopGesture;
protected:
bool on_expose_event (GdkEventExpose*);
void render (cairo_t* cr);
bool on_button_press_event (GdkEventButton*);
bool on_button_release_event (GdkEventButton*);
bool on_motion_notify_event (GdkEventMotion*);

View file

@ -21,10 +21,10 @@
#define __gtk_ardour_panner_interface_h__
#include <boost/shared_ptr.hpp>
#include <gtkmm/drawingarea.h>
#include <gtkmm/label.h>
#include "gtkmm2ext/persistent_tooltip.h"
#include "pbd/destructible.h"
#include "gtkmm2ext/cairo_widget.h"
namespace ARDOUR {
class Panner;
@ -48,7 +48,7 @@ private:
/** Parent class for some panner UI classes that contains some common code */
class PannerInterface : public Gtk::DrawingArea, public PBD::Destructible
class PannerInterface : public CairoWidget, public PBD::Destructible
{
public:
PannerInterface (boost::shared_ptr<ARDOUR::Panner>);

View file

@ -112,20 +112,18 @@ StereoPanner::set_tooltip ()
_tooltip.set_tip (buf);
}
bool
StereoPanner::on_expose_event (GdkEventExpose*)
void
StereoPanner::render (cairo_t* cr)
{
Cairo::RefPtr<Cairo::Context> context = get_window()->create_cairo_context();
unsigned pos = (unsigned)(rint (100.0 * position_control->get_value ())); /* 0..100 */
double x = (get_width() - _knob_image[pos]->get_width())/2.0;
double y = (get_height() - _knob_image[pos]->get_height())/2.0;
cairo_rectangle (context->cobj(), x, y, _knob_image[pos]->get_width(), _knob_image[pos]->get_height());
cairo_rectangle (cr, x, y, _knob_image[pos]->get_width(), _knob_image[pos]->get_height());
gdk_cairo_set_source_pixbuf (context->cobj(), _knob_image[pos]->gobj(), x, y);
cairo_fill (context->cobj());
return true;
gdk_cairo_set_source_pixbuf (cr, _knob_image[pos]->gobj(), x, y);
cairo_fill (cr);
}
bool

View file

@ -51,7 +51,7 @@ class StereoPanner : public PannerInterface
sigc::signal<void> StopWidthGesture;
protected:
bool on_expose_event (GdkEventExpose*);
void render (cairo_t* cr);
bool on_button_press_event (GdkEventButton*);
bool on_button_release_event (GdkEventButton*);
bool on_motion_notify_event (GdkEventMotion*);

View file

@ -203,21 +203,30 @@
</VBox>
</EventBox>
<HBox>
<EventBox id="master_bus_ui_home"/>
<EventBox id="compact_meter_bridge_home"
bgnormal="#383838"
box.expand="true"
box.fill="true">
</EventBox>
<VBox>
<EventBox id="master_bus_ui_home"/>
<EventBox bgnormal="#000000"
height="4"/>
</VBox>
<EventBox bgnormal="#000000"
width="4"/>
<VBox box.expand="true"
box.fill="true">
<EventBox id="compact_meter_bridge_home"
bgnormal="#383838"
box.expand="true"
box.fill="true"/>
<EventBox bgnormal="#383838"
height="5"/>
<EventBox bgnormal="#000000"
height="2"/>
</VBox>
</HBox>
<HBox box.pack="end"
box.fill="true"
box.expand="true">
<VBox>
<EventBox id="inspector_home"
box.fill="true"
box.expand="true"/>
</VBox>
<EventBox id="inspector_home"/>
<EventBox bgnormal="#000000" width="4"/>
<VBox box.fill="true"
box.expand="true">
<HPaned id="edit_pane"
@ -266,7 +275,8 @@
table.bottomattach="3"
table.xfill="true"
table.yfill="true"
table.yexpand="true">
table.yexpand="true"
bgnormal="#3E3E3E">
<HBox>
<VBox id="edit_controls_vbox"/>
</HBox>
@ -274,7 +284,10 @@
</Table>
</VPaned>
</HPaned>
<EventBox id="mixer_ui_home"
<EventBox bgnormal="#000000"
height="4"/>
<EventBox id="mixer_bridge_view_home"
height="411"
box.pack="end"/>
</VBox>
</HBox>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<CompactMeterbridge bgnormal="#353535">
<ScrolledWindow hscroll="always"
vscroll="never"
box.expand="true"
box.fill="true">
<EventBox bgnormal="#383838">
<Hbox id="mixer_strips_home"/>
</EventBox>
</ScrolledWindow>
</CompactMeterbridge>

View file

@ -3,7 +3,7 @@
<Adjustment id="gain_adjustment"
minvalue="0"
maxvalue="1"/>
<VBox Layout="" bgnormal="#380000" bgactive="#6A0000" width="57" height="252">
<VBox Layout="" bgnormal="#380000" bgactive="#6A0000" width="57" height="260">
<Button id="peak_display_button"
x="0" y="0"
width="59" height="18"
@ -16,26 +16,27 @@
borderwidth="1 1 0 0"/>
<HBox>
<VBox>
<HBox height ="10"/>
<VBox id="level_meter_home"
x="1"
y="36"
width="17"
height="187"/>
<HBox height ="13"/>
<HBox box.padding="18" spacing="4">
<VBox id="level_meter_home"
width="17"
height="187"/>
<icon source="mixer_strip_meter_marks.png"/>
</HBox>
</VBox>
<VBox>
<Fader id="gain_slider"
adjustment="gain_adjustment"
facesource="slider_controller_fader.png"
activefacesource="slider_controller_active_fader.png"
underlaysource="slider_controller_fader_underlay.png"
handlesource="slider_controller_fader_handle.png"
activehandlesource="slider_controller_fader_handle.png"
minposx="10"
minposy="196"
maxposx="10"
maxposy="10"
box.padding="8"/>
</VBox>
<icon source="mixer_strip_meter_marks.png"/>
<Fader id="gain_slider" bgnormal="#303030" bgactive="#545454"
adjustment="gain_adjustment"
facesource="slider_controller_fader.png"
underlaysource="slider_controller_fader_underlay.png"
handlesource="slider_controller_fader_handle.png"
activehandlesource="slider_controller_fader_handle.png"
minposx="10"
minposy="196"
maxposx="10"
maxposy="10"
height="210"/>
</HBox>
<EventBox id="gain_display_home"
width="57"

View file

@ -1,200 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<RouteUI>
<EventBox bgnormal="#383838" bgactive="#545454">
<VBox>
<EventBox id="color_palette_home" borderwidth="1" noshowall="true" visible="false">
<VBox>
<iconbutton id="color_palette_button"
width="95"
height="17"
normalicon="inspector_color_close"
activeicon="inspector_color_open"/>
<VBox id="color_buttons_home">
<HBox>
<iconbutton id="color_button_1"
width="19"
height="19"
normalicon="inspector_color_1"
activeicon="inspector_color_1_active"
prelighticon="inspector_color_1_prelight"/>
<iconbutton id="color_button_2"
width="19"
height="19"
normalicon="inspector_color_2"
activeicon="inspector_color_2_active"
prelighticon="inspector_color_2_prelight"/>
<iconbutton id="color_button_3"
width="19"
height="19"
normalicon="inspector_color_3"
activeicon="inspector_color_3_active"
prelighticon="inspector_color_3_prelight"/>
<iconbutton id="color_button_4"
width="19"
height="19"
normalicon="inspector_color_4"
activeicon="inspector_color_4_active"
prelighticon="inspector_color_4_prelight"/>
<iconbutton id="color_button_5"
width="19"
height="19"
normalicon="inspector_color_5"
activeicon="inspector_color_5_active"
prelighticon="inspector_color_5_prelight"/>
</HBox>
<HBox>
<iconbutton id="color_button_6"
width="19"
height="19"
normalicon="inspector_color_6"
activeicon="inspector_color_6_active"
prelighticon="inspector_color_6_prelight"/>
<iconbutton id="color_button_7"
width="19"
height="19"
normalicon="inspector_color_7"
activeicon="inspector_color_7_active"
prelighticon="inspector_color_7_prelight"/>
<iconbutton id="color_button_8"
width="19"
height="19"
normalicon="inspector_color_8"
activeicon="inspector_color_8_active"
prelighticon="inspector_color_8_prelight"/>
<iconbutton id="color_button_9"
width="19"
height="19"
normalicon="inspector_color_9"
activeicon="inspector_color_9_active"
prelighticon="inspector_color_9_prelight"/>
<iconbutton id="color_button_10"
width="19"
height="19"
normalicon="inspector_color_10"
activeicon="inspector_color_10_active"
prelighticon="inspector_color_10_prelight"/>
</HBox>
<HBox>
<iconbutton id="color_button_11"
width="19"
height="19"
normalicon="inspector_color_11"
activeicon="inspector_color_11_active"
prelighticon="inspector_color_11_prelight"/>
<iconbutton id="color_button_12"
width="19"
height="19"
normalicon="inspector_color_12"
activeicon="inspector_color_12_active"
prelighticon="inspector_color_12_prelight"/>
<iconbutton id="color_button_13"
width="19"
height="19"
normalicon="inspector_color_13"
activeicon="inspector_color_13_active"
prelighticon="inspector_color_13_prelight"/>
<iconbutton id="color_button_14"
width="19"
height="19"
normalicon="inspector_color_14"
activeicon="inspector_color_14_active"
prelighticon="inspector_color_14_prelight"/>
<iconbutton id="color_button_15"
width="19"
height="19"
normalicon="inspector_color_15"
activeicon="inspector_color_15_active"
prelighticon="inspector_color_15_prelight"/>
</HBox>
</VBox>
</VBox>
</EventBox>
<VBox borderwidth="1"
noshowall="true"
visible="false">
<iconbutton id="info_panel_button"
width="95"
height="17"
normalicon="inspector_info_close"
activeicon="inspector_info_open"/>
<VBox id="info_panel_home"
noshowall="true"
visible="false">
<VBox height="1"/>
<EventBox bgnormal="#4F4F4F" width="95">
<VBox>
<HBox box.padding="4">
<HBox width="7"/>
<Label id="input_info_label"
text="IN Grisha, Kolya"
font="Arial Bold 7"/>
<HBox box.fill="true" box.expand="true"/>
</HBox>
<HBox>
<HBox width="7"/>
<Label id="output_info_label"
text="OUT please code it"
font="Arial Bold 7"/>
<HBox box.fill="true" box.expand="true"/>
</HBox>
<HBox height="5"/>
</VBox>
</EventBox>
</VBox>
</VBox>
<VBox box.pack="end">
<HBox>
<EventBox bgnormal="#383838" bgactive="#545454">
<VBox>
<EventBox id="panners_home" bgnormal="#383838" bgactive="#545454" width="57" height="60"/>
<HBox id="level_meter_home"/>
<Vbox>
<HBox id="gain_meter_home"/>
<!--RouteUI-->
<HBox id="invert_button_box" visible="false"/>
<EventBox bgnormal="#000000" width="50">
<EventBox borderwidth="1" bgnormal="#383838" bgactive="#545454">
<VBox spacing="1">
<HBox spacing="1">
<iconbutton id="rec_enable_button"
width="28"
height="20"
normalicon="mixer_record"
activeicon="mixer_record_active"
prelighticon="mixer_record_prelight"/>
<iconbutton id="monitor_input_button"
width="28"
height="20"
normalicon="mixer_monitor_input"
activeicon="mixer_monitor_input_active"
prelighticon="mixer_monitor_input_prelight"/>
</HBox>
<HBox spacing="1">
<iconbutton id="mute_button"
width="28"
height="20"
normalicon="mixer_mute"
activeicon="mixer_mute_active"
prelighticon="mixer_mute_prelight"/>
<iconbutton id="solo_button"
width="28"
height="20"
normalicon="mixer_solo"
activeicon="mixer_solo_active"
prelighticon="mixer_solo_prelight"/>
</HBox>
<Button id="name_button"
width="57"
height="28"/>
</VBox>
</EventBox>
<EventBox borderwidth="1" bgnormal="#383838" bgactive="#545454">
<VBox>
<HBox>
<iconbutton id="rec_enable_button"
width="28"
height="20"
normalicon="mixer_record"
activeicon="mixer_record_active"
prelighticon="mixer_record_prelight"/>
<EventBox bgnormal="#000000"
bgactive="#000000"
width="1"/>
<iconbutton id="monitor_input_button"
width="28"
height="20"
normalicon="mixer_monitor_input"
activeicon="mixer_monitor_input_active"
prelighticon="mixer_monitor_input_prelight"/>
</HBox>
<EventBox bgnormal="#000000"
bgactive="#000000"
height="1"/>
<HBox>
<iconbutton id="mute_button"
width="28"
height="20"
normalicon="mixer_mute"
activeicon="mixer_mute_active"
implicitactiveicon="mixer_mute_implicit"
prelighticon="mixer_mute_prelight"/>
<EventBox bgnormal="#000000"
bgactive="#000000"
width="1"/>
<iconbutton id="solo_button"
width="28"
height="20"
normalicon="mixer_solo"
activeicon="mixer_solo_active"
implicitactiveicon="mixer_solo_safe"
prelighticon="mixer_solo_prelight"/>
</HBox>
<EventBox bgnormal="#000000"
bgactive="#000000"
height="1"/>
<Button id="name_button"
width="57"
height="28"/>
</VBox>
</EventBox>
<Button id="show_sends_button" visible="false" noshowall="true"/>
<Button id="monitor_disk_button" visible="false" noshowall="true"/>
<Button id="comment_button" visible="false" noshowall="true"/>
<Button id="midi_input_enable_button" visible="false" noshowall="true"/>
<Button id="group_button" text="Grp" visible="false" noshowall="true"/>
</Vbox>
</VBox>
</VBox>
</EventBox>
</EventBox>
<EventBox bgnormal="#000000"
bgactive="#000000"
width="1"/>
</HBox>
<Button id="show_sends_button" ui.orphan="true"/>
<Button id="monitor_disk_button" ui.orphan="true"/>
<Button id="comment_button" ui.orphan="true"/>
<Button id="midi_input_enable_button" ui.orphan="true"/>
<Button id="group_button" text="Grp" ui.orphan="true"/>
<HBox id="invert_button_box" ui.orphan="true"/>
<button id="color_palette_button" ui.orphan="true"/>
<button id="color_button_1" ui.orphan="true"/>
<button id="color_button_2" ui.orphan="true"/>
<button id="color_button_3" ui.orphan="true"/>
<button id="color_button_4" ui.orphan="true"/>
<button id="color_button_5" ui.orphan="true"/>
<button id="color_button_6" ui.orphan="true"/>
<button id="color_button_7" ui.orphan="true"/>
<button id="color_button_8" ui.orphan="true"/>
<button id="color_button_9" ui.orphan="true"/>
<button id="color_button_10" ui.orphan="true"/>
<button id="color_button_11" ui.orphan="true"/>
<button id="color_button_12" ui.orphan="true"/>
<button id="color_button_13" ui.orphan="true"/>
<button id="color_button_14" ui.orphan="true"/>
<button id="color_button_15" ui.orphan="true"/>
<EventBox id="color_palette_home" ui.orphan="true"/>
<VBox id="color_buttons_home" ui.orphan="true"/>
<Button id="info_panel_button" ui.orphan="true"/>
<Label id="input_info_label" ui.orphan="true"/>
<Label id="output_info_label" ui.orphan="true"/>
<VBox id="info_panel_home" ui.orphan="true"/>
</RouteUI>

View file

@ -27,6 +27,7 @@ def copyfile(task):
path_prefix = 'gtk2_ardour/'
gtk2_ardour_sources = [
'mixer_bridge_view.cc',
'waves_ui.cc',
'about.cc',
'actions.cc',

View file

@ -188,19 +188,16 @@ Fader::Fader (Gtk::Adjustment& adj,
adjustment.signal_value_changed().connect (mem_fun (*this, &Fader::adjustment_changed));
adjustment.signal_changed().connect (mem_fun (*this, &Fader::adjustment_changed));
DrawingArea::set_size_request(_face_pixbuf->get_width(), _face_pixbuf->get_height());
CairoWidget::set_size_request(_face_pixbuf->get_width(), _face_pixbuf->get_height());
}
Fader::~Fader ()
{
}
bool
Fader::on_expose_event (GdkEventExpose* ev)
void
Fader::render (cairo_t* cr)
{
Cairo::RefPtr<Cairo::Context> context = get_window()->create_cairo_context();
cairo_t* cr = context->cobj();
get_handle_position (_last_drawn_x, _last_drawn_y);
if (_underlay_pixbuf != 0) {
@ -234,8 +231,6 @@ Fader::on_expose_event (GdkEventExpose* ev)
_last_drawn_y - _handle_pixbuf->get_height()/2.0);
}
cairo_fill (cr);
return true;
}
void
@ -248,7 +243,7 @@ Fader::on_size_request (GtkRequisition* req)
void
Fader::on_size_allocate (Gtk::Allocation& alloc)
{
DrawingArea::on_size_allocate(alloc);
CairoWidget::on_size_allocate(alloc);
update_unity_position ();
}

View file

@ -23,10 +23,10 @@
#include <cmath>
#include <stdint.h>
#include <gtkmm/drawingarea.h>
#include <gtkmm/adjustment.h>
#include <gdkmm.h>
#include <gtkmm2ext/binding_proxy.h>
#include "gtkmm2ext/cairo_widget.h"
#include <boost/shared_ptr.hpp>
@ -34,7 +34,7 @@
namespace Gtkmm2ext {
class LIBGTKMM2EXT_API Fader : public Gtk::DrawingArea
class LIBGTKMM2EXT_API Fader : public CairoWidget
{
public:
Fader (Gtk::Adjustment& adjustment,
@ -61,7 +61,7 @@ class LIBGTKMM2EXT_API Fader : public Gtk::DrawingArea
void on_size_request (GtkRequisition*);
void on_size_allocate (Gtk::Allocation& alloc);
bool on_expose_event (GdkEventExpose*);
void render (cairo_t* cr);
bool on_button_press_event (GdkEventButton*);
bool on_button_release_event (GdkEventButton*);
bool on_motion_notify_event (GdkEventMotion*);