drag'n'drop-support everywhere
git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@38 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
100
ChangeLog
100
ChangeLog
@@ -1,3 +1,103 @@
|
||||
2005-12-18 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
|
||||
* src/tracks/pattern.cpp:
|
||||
use Sint32 instead of Sint16 for determining central key, otherwise we
|
||||
might get overflows when having a lot of notes
|
||||
|
||||
* src/tracks/sample_track.cpp:
|
||||
draw zero-line if sample is shorter than TCO
|
||||
|
||||
* src/core/track.cpp:
|
||||
display text-float with current position/size when moving/resizing TCO
|
||||
|
||||
* src/core/song_editor.cpp:
|
||||
do correct positioning for text-floats for master-volume/-pitch
|
||||
|
||||
* include/envelope_and_lfo_widget.h:
|
||||
* src/core/envelope_and_lfo_widget.cpp:
|
||||
added support for user-defined wave-shapes - the user just has to drag
|
||||
an audio-sample into envelope/lfo-widget and that's all ;-)
|
||||
|
||||
* src/tracks/pattern.cpp:
|
||||
* src/tracks/sample_track.cpp:
|
||||
make sound-buffer of frozen pattern draggable to sample in
|
||||
sample-track
|
||||
|
||||
* include/sample_buffer.h:
|
||||
* src/lib/sample_buffer.cpp:
|
||||
support for base64-encoding of sample-data into a QString
|
||||
|
||||
* src/core/track_container.cpp:
|
||||
import MIDI-file to itself when getting according drag'n'drop-request
|
||||
|
||||
* plugins/audio_file_processor/audio_file_processor.h:
|
||||
* plugins/audio_file_processor/audio_file_processor.cpp:
|
||||
receive drop-events (set dragged sample etc.)
|
||||
|
||||
* plugins/vestige/fstclient.h:
|
||||
* plugins/vestige/fstclient.cpp:
|
||||
renamed removeVSTPlugin::write/readValue to write/readValueS for
|
||||
compiling even with buggy GCC 3.x
|
||||
|
||||
* include/file_browser.h:
|
||||
* src/core/file_browser.cpp:
|
||||
made up all that drag'n'drop-stuff, you're now able to drag samples
|
||||
and presets directly to according channel, sample etc.
|
||||
|
||||
2005-12-17 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
|
||||
* include/bb_editor.h:
|
||||
* include/pattern.h:
|
||||
* src/core/bb_editor.cpp:
|
||||
* src/tracks/pattern.cpp:
|
||||
always update according bb-tracks when changing pattern/it's length
|
||||
|
||||
* include/track.h:
|
||||
* src/core/track.cpp:
|
||||
* src/core/track_container.cpp:
|
||||
drag'n'drop everywhere - now you can drag every track-content-object
|
||||
(e.g. a pattern) to every other track-content-object of the same type
|
||||
or to a free place in an according track or just in another
|
||||
track-container
|
||||
|
||||
* include/mmp.h:
|
||||
* src/lib/mmp.cpp:
|
||||
allow additionally to load data from given string instead of file
|
||||
|
||||
* include/timeline.h:
|
||||
* src/core/timeline.cpp:
|
||||
- disable magnetic loop-points when pressing control
|
||||
- set start-point directly to given position when pressing middle
|
||||
mouse-button, do the same for end-point of shift is pressed at the
|
||||
same time
|
||||
|
||||
* include/piano_roll.h:
|
||||
* include/song_editor.h:
|
||||
* src/core/piano_roll.cpp:
|
||||
* src/core/song_editor.cpp:
|
||||
use modifier-key-states from lmmsMainWin instead of monitoring them on
|
||||
it's own
|
||||
|
||||
* include/lmms_main_win.h:
|
||||
* src/core/lmms_main_win.cpp:
|
||||
capture key-events and save states of shift, control- and alt-key
|
||||
everytime it changes - other widgets can use this for querying whether
|
||||
one of these modifier-keys is pressed
|
||||
|
||||
2005-12-16 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
|
||||
* configure.in:
|
||||
added better LADSPA-check and fixed some other small things
|
||||
|
||||
* src/core/mixer.cpp:
|
||||
query attribute "mididev" instead of "midiclient" for determining
|
||||
selected MIDI-device - fixes bug with apparently non-selectable
|
||||
MIDI-device/-client
|
||||
|
||||
* src/core/plugin.cpp:
|
||||
* src/lib/ladspa_manager.cpp:
|
||||
load plugins using QLibrary instead of platform-dependent dl-functions
|
||||
|
||||
2005-12-15 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
|
||||
* include/audio_alsa.h:
|
||||
|
||||
@@ -280,7 +280,7 @@ lmms_SOURCES = \
|
||||
|
||||
|
||||
|
||||
EXTRA_DIST = $(lmms_EMBEDDED_RESOURCES)
|
||||
EXTRA_DIST = $(lmms_EMBEDDED_RESOURCES) aeffectx_h_fix.patch
|
||||
|
||||
|
||||
CLEANFILES = $(lmms_MOC) ./embedded_resources.h
|
||||
|
||||
6
TODO
6
TODO
@@ -1,18 +1,16 @@
|
||||
to be done as soon as possible:
|
||||
|
||||
- MIDI-program/MIDI-mapping/process program-/channel-change-events from MIDI-files
|
||||
- do not allow to connect output-port of channel to own input-port!
|
||||
- add note-len- and note-alignment-selectbox to piano-roll
|
||||
- fix audio/midi-settings stuff/translation
|
||||
- tooltips for controls in MIDI-tab
|
||||
- sample-track: sane bg and wave-color
|
||||
- dnd everywhere: presets, samples (afp/sample-track), TCO's, knob-values
|
||||
- dnd: knob-values
|
||||
- DSSI-support
|
||||
- save/load parameters of VST-plugin
|
||||
- somehow avoid hidden plugin-descriptor-widgets plugin-browser if height of window is too small -> add scrollbar
|
||||
- use drawLineF() for drawing notes in pattern::paintEvent() in qt4-version
|
||||
- only redraw region given by paint-event in pattern, bbTCO, sampleTCO etc.
|
||||
- use midi-maps
|
||||
- process program-/channel-change-events from MIDI-files
|
||||
- pre-listen when opening sample with QFileDialog
|
||||
- level-meters in output-graph and channel-track
|
||||
- panning-editing in piano-roll
|
||||
|
||||
@@ -265,12 +265,3 @@ AC_SUBST(QASSISTANTCLIENT_LDADD)
|
||||
|
||||
])
|
||||
|
||||
|
||||
dnl **** Link C code with an assembly file ****
|
||||
dnl
|
||||
dnl Usage: WINE_TRY_ASM_LINK(asm-code,includes,function,[action-if-found,[action-if-not-found]])
|
||||
dnl
|
||||
AC_DEFUN([WINE_TRY_ASM_LINK],
|
||||
[AC_TRY_LINK([void ac_asm(void) { asm([$1]); }
|
||||
[$2]],[$3],[$4],[$5])])
|
||||
|
||||
|
||||
51
configure.in
51
configure.in
@@ -2,8 +2,8 @@
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.50)
|
||||
AC_INIT(lmms, 0.1.1-cvs20051215, tobydox/at/users.sourceforge.net)
|
||||
AM_INIT_AUTOMAKE(lmms, 0.1.1-cvs20051215)
|
||||
AC_INIT(lmms, 0.1.1-cvs20051218, tobydox/at/users.sourceforge.net)
|
||||
AM_INIT_AUTOMAKE(lmms, 0.1.1-cvs20051218)
|
||||
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
|
||||
@@ -22,7 +22,7 @@ gw_CHECK_QT
|
||||
# checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_SYS_WAIT
|
||||
AC_CHECK_HEADERS([fcntl.h memory.h string.h sys/ioctl.h unistd.h stdlib.h dlfcn.h ladspa.h pthread.h sys/ipc.h sys/shm.h sys/time.h sys/select.h sys/types.h stdarg.h])
|
||||
AC_CHECK_HEADERS([fcntl.h memory.h string.h sys/ioctl.h unistd.h stdlib.h pthread.h sys/ipc.h sys/shm.h sys/time.h sys/select.h sys/types.h stdarg.h])
|
||||
|
||||
# checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
@@ -156,7 +156,7 @@ fi
|
||||
AM_CONDITIONAL(HAVE_LIBJACK, test ! -z "$HAVE_JACK_JACK_H")
|
||||
|
||||
|
||||
# check for proper wine-installation and existing Steinberg headers
|
||||
# check for proper WINE-installation and existing Steinberg headers
|
||||
AC_ARG_WITH(vst,
|
||||
AS_HELP_STRING([--with-vst],
|
||||
[enable support for builtin VST-plugin-hosting]), [ with_vst=yes ], [ with_vst=no ])
|
||||
@@ -177,6 +177,20 @@ fi
|
||||
AM_CONDITIONAL(VST_SUPPORT, test ! -z "$WINEGCC")
|
||||
|
||||
|
||||
# check for LADSPA-SDK
|
||||
AC_ARG_WITH(src,
|
||||
AS_HELP_STRING([--without-ladspa],
|
||||
[disable support for LADSPA-support]), ,
|
||||
[ with_ladspa=yes ])
|
||||
AH_TEMPLATE(HAVE_LADSPA_H, [Define to 1 if you have the <ladspa.h> header file.])
|
||||
if test "x$with_ladspa" = "xyes" ; then
|
||||
AC_CHECK_HEADER(ladspa.h, HAVE_LADSPA_H="true")
|
||||
fi
|
||||
if test ! -z "$HAVE_LADSPA_H" ; then
|
||||
AC_DEFINE(HAVE_LADSPA_H)
|
||||
fi
|
||||
|
||||
|
||||
# check for vorbis-lib
|
||||
AC_ARG_WITH(vorbis,
|
||||
AS_HELP_STRING([--without-vorbis],
|
||||
@@ -201,7 +215,7 @@ AM_CONDITIONAL(HAVE_LIBVORBIS, test ! -z "$OGG_SUPPORT")
|
||||
|
||||
|
||||
# check for libsamplerate
|
||||
AC_ARG_WITH(src,
|
||||
AC_ARG_WITH(libsrc,
|
||||
AS_HELP_STRING([--without-libsrc],
|
||||
[disable support for resampling via libsamplerate]), ,
|
||||
[ with_libsrc=yes ])
|
||||
@@ -217,7 +231,7 @@ AM_CONDITIONAL(HAVE_LIBSRC, test ! -z "$HAVE_SAMPLERATE_H")
|
||||
|
||||
|
||||
# libsndfile-stuff
|
||||
AC_ARG_WITH(src,
|
||||
AC_ARG_WITH(sndfile,
|
||||
AS_HELP_STRING([--without-libsf],
|
||||
[disable support for importing files via libsndfile]), ,
|
||||
[ with_libsf=yes ])
|
||||
@@ -364,7 +378,7 @@ lmmsdatadir="$datadir/$PACKAGE"
|
||||
AC_SUBST(lmmsdatadir)
|
||||
|
||||
|
||||
CXXFLAGS="$CXXFLAGS -g0"
|
||||
# CXXFLAGS="$CXXFLAGS -g0"
|
||||
if test $CXX == "g++" ; then
|
||||
CXXFLAGS="$CXXFLAGS -ansi -Wall -fno-exceptions"
|
||||
fi
|
||||
@@ -542,6 +556,24 @@ fi
|
||||
|
||||
|
||||
|
||||
# not yet...
|
||||
#if test -z "$HAVE_LADSPA_H" ; then
|
||||
# echo " ========================"
|
||||
# echo " === LMMS - WARNING ======================================================="
|
||||
# echo " ========================"
|
||||
# echo " ="
|
||||
# echo " = You don't seem to have installed LADSPA-SDK which is neccessary for"
|
||||
# echo " = building LMMS with LADSPA support. LADSPA-support is very useful"
|
||||
# echo " = as you're able to use a lot of LADSPA-effects inside LMMS."
|
||||
# echo " = Consider installing the missing packages for using the full power of LMMS."
|
||||
# echo " ="
|
||||
# with_warnings="true"
|
||||
#else
|
||||
# PLUGINS_TO_BUILD="$PLUGINS_TO_BUILD\n\t\* LADSPA-plugins"
|
||||
#fi
|
||||
|
||||
|
||||
|
||||
|
||||
if test -z "$HAVE_SAMPLERATE_H" ; then
|
||||
echo " ========================"
|
||||
@@ -585,7 +617,8 @@ else
|
||||
echo " ="
|
||||
echo " = ftp://ext2asio:sdk1ext@ftp.pinnaclesys.com/SDK"
|
||||
echo " ="
|
||||
echo " = and put the mentioned files into /usr/include/vst."
|
||||
echo " = and put the mentioned files into /usr/include/vst. Make sure, they're"
|
||||
echo " = patched with file aeffectx_h_fix.patch!"
|
||||
echo " = Otherwise (now!) configure will disable LMMS's support for built-in VST-"
|
||||
echo " = plugin-usage. If you do not intend to use VST-plugins with LMMS you can "
|
||||
echo " = ignore this warning."
|
||||
@@ -601,7 +634,7 @@ else
|
||||
echo " ========================"
|
||||
echo " ="
|
||||
echo " = You don't seem to have installed WINE or it's development-packages (headers,"
|
||||
echo " = (winegcc etc.) which is neccessary for building LMMS with built-in"
|
||||
echo " = winegcc etc.) which are neccessary for building LMMS with built-in"
|
||||
echo " = VST-support."
|
||||
echo " = If you do not intend to use VST-plugins with LMMS you can ignore this "
|
||||
echo " = warning."
|
||||
|
||||
@@ -82,6 +82,8 @@ public:
|
||||
|
||||
void FASTCALL swapBB( csize _bb1, csize _bb2 );
|
||||
|
||||
void updateBBTrack( trackContentObject * _tco );
|
||||
|
||||
|
||||
protected:
|
||||
virtual void closeEvent( QCloseEvent * _ce );
|
||||
|
||||
@@ -101,7 +101,7 @@ public:
|
||||
bbTrack( trackContainer * _tc );
|
||||
virtual ~bbTrack();
|
||||
|
||||
virtual trackTypes trackType( void ) const;
|
||||
virtual trackTypes type( void ) const;
|
||||
virtual bool FASTCALL play( const midiTime & _start,
|
||||
Uint32 _start_frame, Uint32 _frames,
|
||||
Uint32 _frame_base,
|
||||
|
||||
@@ -48,10 +48,12 @@
|
||||
#include "settings.h"
|
||||
#include "types.h"
|
||||
#include "spc_bg_hndl_widget.h"
|
||||
#include "sample_buffer.h"
|
||||
|
||||
|
||||
class QPaintEvent;
|
||||
class QPixmap;
|
||||
|
||||
class envelopeTabWidget;
|
||||
class knob;
|
||||
class ledCheckBox;
|
||||
@@ -59,6 +61,7 @@ class pixmapButton;
|
||||
class tempoSyncKnob;
|
||||
|
||||
|
||||
|
||||
class envelopeAndLFOWidget : public QWidget, public settings,
|
||||
public specialBgHandlingWidget
|
||||
{
|
||||
@@ -97,8 +100,10 @@ public slots:
|
||||
|
||||
|
||||
protected:
|
||||
void paintEvent( QPaintEvent * _pe );
|
||||
void mousePressEvent( QMouseEvent * _me );
|
||||
virtual void dragEnterEvent( QDragEnterEvent * _dee );
|
||||
virtual void dropEvent( QDropEvent * _de );
|
||||
virtual void mousePressEvent( QMouseEvent * _me );
|
||||
virtual void paintEvent( QPaintEvent * _pe );
|
||||
|
||||
float FASTCALL lfoLevel( Uint32 _frame, Uint32 _frame_offset ) const;
|
||||
|
||||
@@ -109,10 +114,14 @@ protected slots:
|
||||
void lfoTriangleWaveCh( bool );
|
||||
void lfoSawWaveCh( bool );
|
||||
void lfoSquareWaveCh( bool );
|
||||
void lfoUserWaveCh( bool );
|
||||
void x100Toggled( bool );
|
||||
|
||||
|
||||
private:
|
||||
static QPixmap * s_envGraph;
|
||||
static QPixmap * s_lfoGraph;
|
||||
|
||||
static Uint32 s_lfoFrame;
|
||||
|
||||
bool m_used;
|
||||
@@ -125,7 +134,6 @@ private:
|
||||
knob * m_sustainKnob;
|
||||
knob * m_releaseKnob;
|
||||
knob * m_amountKnob;
|
||||
static QPixmap * s_envGraph;
|
||||
|
||||
float m_sustainLevel;
|
||||
float m_amount;
|
||||
@@ -145,7 +153,7 @@ private:
|
||||
pixmapButton * m_triangleLfoBtn;
|
||||
pixmapButton * m_sawLfoBtn;
|
||||
pixmapButton * m_sqrLfoBtn;
|
||||
static QPixmap * s_lfoGraph;
|
||||
pixmapButton * m_usrLfoBtn;
|
||||
|
||||
ledCheckBox * m_x100Cb;
|
||||
ledCheckBox * m_controlEnvAmountCb;
|
||||
@@ -156,13 +164,15 @@ private:
|
||||
float m_lfoAmount;
|
||||
bool m_lfoAmountIsZero;
|
||||
float * m_lfoShapeData;
|
||||
sampleBuffer m_userWave;
|
||||
|
||||
enum lfoShapes
|
||||
{
|
||||
SIN,
|
||||
TRIANGLE,
|
||||
SAW,
|
||||
SQUARE
|
||||
SQUARE,
|
||||
USER
|
||||
} m_lfoShape;
|
||||
|
||||
volatile bool m_busy;
|
||||
|
||||
@@ -50,9 +50,11 @@
|
||||
|
||||
|
||||
class fileItem;
|
||||
class trackContainer;
|
||||
class QPixmap;
|
||||
class listView;
|
||||
class playHandle;
|
||||
class QPixmap;
|
||||
class trackContainer;
|
||||
|
||||
|
||||
|
||||
class fileBrowser : public sideBarWidget
|
||||
@@ -69,52 +71,61 @@ public slots:
|
||||
void reloadTree( void );
|
||||
|
||||
|
||||
protected:
|
||||
void keyPressEvent( QKeyEvent * _ke );
|
||||
|
||||
|
||||
protected slots:
|
||||
#ifdef QT4
|
||||
void itemPressed( int btn, Q3ListViewItem * _i, const QPoint & _pos,
|
||||
int _col );
|
||||
void itemReleased( int btn, Q3ListViewItem * _i, const QPoint & _pos,
|
||||
int _col );
|
||||
void itemDoubleClicked( Q3ListViewItem * _i, const QPoint & _pos,
|
||||
int _col );
|
||||
void contextMenuRequest( Q3ListViewItem * _i, const QPoint & _pos,
|
||||
int _col );
|
||||
#else
|
||||
void itemPressed( int btn, QListViewItem * _i, const QPoint & _pos,
|
||||
int _col );
|
||||
void itemReleased( int btn, QListViewItem * _i, const QPoint & _pos,
|
||||
int _col );
|
||||
void itemDoubleClicked( QListViewItem * _i, const QPoint & _pos,
|
||||
int _col );
|
||||
void contextMenuRequest( QListViewItem * _i, const QPoint & _pos,
|
||||
int _col );
|
||||
#endif
|
||||
void selectionChanged( void );
|
||||
void sendToActiveChannel( void );
|
||||
void openInNewChannelSE( void );
|
||||
void openInNewChannelBBE( void );
|
||||
void renameItem( void );
|
||||
|
||||
|
||||
private:
|
||||
virtual void keyPressEvent( QKeyEvent * _ke );
|
||||
void openInNewChannel( trackContainer * _tc );
|
||||
|
||||
Q3ListView * m_l;
|
||||
listView * m_l;
|
||||
fileItem * m_contextMenuItem;
|
||||
|
||||
QString m_path;
|
||||
QString m_filter;
|
||||
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
class listView : public Q3ListView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
listView( QWidget * _parent );
|
||||
~listView();
|
||||
|
||||
|
||||
protected:
|
||||
virtual void contentsMouseDoubleClickEvent( QMouseEvent * _me );
|
||||
virtual void contentsMousePressEvent( QMouseEvent * _me );
|
||||
virtual void contentsMouseMoveEvent( QMouseEvent * _me );
|
||||
virtual void contentsMouseReleaseEvent( QMouseEvent * _me );
|
||||
|
||||
|
||||
private:
|
||||
bool m_mousePressed;
|
||||
QPoint m_pressPos;
|
||||
|
||||
playHandle * m_previewPlayHandle;
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
class directory : public Q3ListViewItem
|
||||
{
|
||||
public:
|
||||
@@ -159,6 +170,7 @@ private:
|
||||
|
||||
|
||||
|
||||
|
||||
class fileItem : public Q3ListViewItem
|
||||
{
|
||||
public:
|
||||
@@ -178,7 +190,7 @@ public:
|
||||
|
||||
enum fileTypes
|
||||
{
|
||||
SONG_FILE, PRESET_FILE, SAMPLE_FILE, UNKNOWN
|
||||
PROJECT_FILE, PRESET_FILE, SAMPLE_FILE, MIDI_FILE, UNKNOWN
|
||||
} ;
|
||||
|
||||
inline fileTypes type( void )
|
||||
@@ -191,9 +203,10 @@ private:
|
||||
void initPixmapStuff( void );
|
||||
void determineFileType( void );
|
||||
|
||||
static QPixmap * s_songFilePixmap;
|
||||
static QPixmap * s_projectFilePixmap;
|
||||
static QPixmap * s_presetFilePixmap;
|
||||
static QPixmap * s_sampleFilePixmap;
|
||||
static QPixmap * s_midiFilePixmap;
|
||||
static QPixmap * s_unknownFilePixmap;
|
||||
|
||||
QPixmap * m_pix;
|
||||
|
||||
@@ -34,7 +34,6 @@ class KMultiTabBarTab;
|
||||
|
||||
#include <QWidget>
|
||||
#include <QMenu>
|
||||
//#include <QVBoxWidget>
|
||||
#include <QString>
|
||||
#include <QBoxLayout>
|
||||
#include <QList>
|
||||
|
||||
@@ -87,90 +87,89 @@ public:
|
||||
}
|
||||
return( s_instanceOfMe );
|
||||
}
|
||||
|
||||
|
||||
/* This identifier can be used as a unique, case-sensitive
|
||||
identifier for the plugin type within the plugin file. Plugin
|
||||
types should be identified by file and label rather than by index
|
||||
or plugin name, which may be changed in new plugin
|
||||
versions. Labels must not contain white-space characters. */
|
||||
QString FASTCALL getLabel( const ladspaKey & _plugin );
|
||||
|
||||
|
||||
/* Indicates that the plugin has a real-time dependency
|
||||
(e.g. listens to a MIDI device) and so its output must not
|
||||
be cached or subject to significant latency. */
|
||||
bool FASTCALL hasRealTimeDependency( const ladspaKey & _plugin );
|
||||
|
||||
|
||||
/* Indicates that the plugin may cease to work correctly if the
|
||||
host elects to use the same data location for both input and output
|
||||
(see connectPort). */
|
||||
bool FASTCALL isInplaceBroken( const ladspaKey & _plugin );
|
||||
|
||||
|
||||
/* Indicates that the plugin is capable of running not only in a
|
||||
conventional host but also in a 'hard real-time' environment. */
|
||||
bool FASTCALL isRealTimeCapable( const ladspaKey & _plugin );
|
||||
|
||||
|
||||
/* Returns the name of the plug-in */
|
||||
QString FASTCALL getName( const ladspaKey & _plugin );
|
||||
|
||||
|
||||
/* Returns the the plug-in's author */
|
||||
QString FASTCALL getMaker( const ladspaKey & _plugin );
|
||||
|
||||
|
||||
/* Returns the copyright for the plug-in */
|
||||
QString FASTCALL getCopyright( const ladspaKey & _plugin );
|
||||
|
||||
|
||||
/* This indicates the number of ports (input AND output) present on
|
||||
the plugin. */
|
||||
Uint32 FASTCALL getPortCount( const ladspaKey & _plugin );
|
||||
|
||||
|
||||
|
||||
|
||||
/* Indicates that the port is an input. */
|
||||
bool FASTCALL isPortInput( const ladspaKey & _plugin, Uint32 _port );
|
||||
|
||||
|
||||
/* Indicates that the port is an output. */
|
||||
bool FASTCALL isPortOutput( const ladspaKey & _plugin, Uint32 _port );
|
||||
|
||||
|
||||
/* Indicates that the port is an audio. */
|
||||
bool FASTCALL isPortAudio( const ladspaKey & _plugin, Uint32 _port );
|
||||
|
||||
|
||||
/* Indicates that the port is an control. */
|
||||
bool FASTCALL isPortControl( const ladspaKey & _plugin, Uint32 _port );
|
||||
|
||||
|
||||
/* Indicates that any bounds specified should be interpreted as
|
||||
multiples of the sample rate. For instance, a frequency range from
|
||||
0Hz to the Nyquist frequency (half the sample rate) could be requested
|
||||
by this hint in conjunction with LowerBound = 0 and UpperBound = 0.5.
|
||||
Hosts that support bounds at all must support this hint to retain meaning. */
|
||||
Hosts that support bounds at all must support this hint to retain
|
||||
meaning. */
|
||||
bool FASTCALL areHintsSampleRateDependent( const ladspaKey & _plugin,
|
||||
Uint32 _port );
|
||||
|
||||
Uint32 _port );
|
||||
|
||||
/* Returns the lower boundary value for the given port. If
|
||||
no lower bound is provided by the plug-in, returns -999e-99. When
|
||||
areHintsSampleRateDependent() is also true then this value should be
|
||||
multiplied by the relevant sample rate. */
|
||||
float FASTCALL getLowerBound( const ladspaKey & _plugin, Uint32 _port );
|
||||
|
||||
|
||||
/* Returns the upper boundary value for the given port. If
|
||||
no upper bound is provided by the plug-in, returns -999e-99. When
|
||||
areHintsSampleRateDependent() is also true then this value should be
|
||||
multiplied by the relevant sample rate. */
|
||||
float FASTCALL getUpperBound( const ladspaKey & _plugin, Uint32 _port );
|
||||
|
||||
|
||||
/* Indicates whether the given port should be considered 0 or 1
|
||||
boolean switch. */
|
||||
bool FASTCALL isPortToggled( const ladspaKey & _plugin, Uint32 _port );
|
||||
|
||||
|
||||
/* Retrieves any default setting hints offered by the plug-in for
|
||||
the given port. */
|
||||
float FASTCALL getDefaultSetting( const ladspaKey & _plugin,
|
||||
Uint32 _port );
|
||||
|
||||
|
||||
Uint32 _port );
|
||||
|
||||
/* Indicates that it is likely that the user will find it more
|
||||
intuitive to view values using a logarithmic scale. This is
|
||||
particularly useful for frequencies and gains. */
|
||||
bool FASTCALL isLogarithmic( const ladspaKey & _plugin, Uint32 _port );
|
||||
|
||||
|
||||
|
||||
/* Indicates that a user interface would probably wish to provide a
|
||||
stepped control taking only integer values. Any bounds set should be
|
||||
slightly wider than the actual integer range required to avoid floating
|
||||
@@ -187,12 +186,14 @@ public:
|
||||
or interpreted by the host. It is expected that most plugin
|
||||
writers will not use this facility as LADSPA_Handle should be
|
||||
used to hold instance data. */
|
||||
const void * FASTCALL getImplementationData( const ladspaKey & _plugin );
|
||||
const void * FASTCALL getImplementationData(
|
||||
const ladspaKey & _plugin );
|
||||
|
||||
|
||||
/* Returns a pointer to the plug-in's descriptor from which control
|
||||
of the plug-in is accessible */
|
||||
const LADSPA_Descriptor * FASTCALL getDescriptor( const ladspaKey & _plugin );
|
||||
const LADSPA_Descriptor * FASTCALL getDescriptor(
|
||||
const ladspaKey & _plugin );
|
||||
|
||||
|
||||
/* The following methods are convenience functions for use during
|
||||
@@ -246,8 +247,9 @@ public:
|
||||
called again unless deactivate() is called first. Note that
|
||||
connectPort() may be called before or after a call to
|
||||
activate(). */
|
||||
void FASTCALL activate( const ladspaKey & _plugin, LADSPA_Handle _instance );
|
||||
|
||||
void FASTCALL activate( const ladspaKey & _plugin,
|
||||
LADSPA_Handle _instance );
|
||||
|
||||
/* This method calls a function pointer that runs an instance of a
|
||||
plugin for a block. Two parameters are required: the first is a
|
||||
handle to the particular instance to be run and the second
|
||||
@@ -260,7 +262,7 @@ public:
|
||||
activate() has been called again. */
|
||||
void FASTCALL run( const ladspaKey & _plugin, LADSPA_Handle _instance,
|
||||
Uint32 _sample_count );
|
||||
|
||||
|
||||
/* This method calls a function pointer that runs an instance of a
|
||||
plugin for a block. This has identical behaviour to run() except
|
||||
in the way data is output from the plugin. When run() is used,
|
||||
@@ -274,9 +276,10 @@ public:
|
||||
runAdding() is optional. When it is not provided by a plugin,
|
||||
this function pointer must be set to NULL. When it is provided,
|
||||
the function setRunAddingGain() must be provided also. */
|
||||
void FASTCALL runAdding( const ladspaKey & _plugin, LADSPA_Handle _instance,
|
||||
Uint32 _sample_count );
|
||||
|
||||
void FASTCALL runAdding( const ladspaKey & _plugin,
|
||||
LADSPA_Handle _instance,
|
||||
Uint32 _sample_count );
|
||||
|
||||
/* This method calls a function pointer that sets the output gain for
|
||||
use when runAdding() is called (see above). If this function is
|
||||
never called the gain is assumed to default to 1. Gain
|
||||
@@ -286,9 +289,10 @@ public:
|
||||
This function should be provided by the plugin if and only if the
|
||||
runAdding() function is provided. When it is absent this
|
||||
function pointer must be set to NULL. */
|
||||
void FASTCALL setRunAddingGain( const ladspaKey & _plugin, LADSPA_Handle _instance,
|
||||
LADSPA_Data _gain );
|
||||
|
||||
void FASTCALL setRunAddingGain( const ladspaKey & _plugin,
|
||||
LADSPA_Handle _instance,
|
||||
LADSPA_Data _gain );
|
||||
|
||||
/* This is the counterpart to activate() (see above). If there is
|
||||
nothing for deactivate() to do then the plugin writer may provide
|
||||
a NULL rather than an empty function.
|
||||
@@ -302,8 +306,9 @@ public:
|
||||
|
||||
Deactivation is not similar to pausing as the plugin instance
|
||||
will be reinitialised when activate() is called to reuse it. */
|
||||
void FASTCALL deactivate( const ladspaKey & _plugin, LADSPA_Handle _instance );
|
||||
|
||||
void FASTCALL deactivate( const ladspaKey & _plugin,
|
||||
LADSPA_Handle _instance );
|
||||
|
||||
/* Once an instance of a plugin has been finished with it can be
|
||||
deleted using the following function. The instance handle passed
|
||||
ceases to be valid after this call.
|
||||
@@ -311,29 +316,29 @@ public:
|
||||
If activate() was called for a plugin instance then a
|
||||
corresponding call to deactivate() must be made before cleanup()
|
||||
is called. */
|
||||
void FASTCALL cleanup( const ladspaKey & _plugin, LADSPA_Handle _instance );
|
||||
|
||||
void FASTCALL cleanup( const ladspaKey & _plugin,
|
||||
LADSPA_Handle _instance );
|
||||
|
||||
private:
|
||||
void FASTCALL addPlugins( void * _plugin_handle,
|
||||
LADSPA_Descriptor_Function _descriptor_func,
|
||||
const QString & _file );
|
||||
void FASTCALL addPlugins( LADSPA_Descriptor_Function _descriptor_func,
|
||||
const QString & _file );
|
||||
|
||||
ladspaManager( void );
|
||||
~ladspaManager();
|
||||
|
||||
|
||||
static ladspaManager * s_instanceOfMe;
|
||||
|
||||
|
||||
typedef struct ladspaManagerStorage
|
||||
{
|
||||
void * pluginHandle;
|
||||
LADSPA_Descriptor_Function descriptorFunction;
|
||||
Uint32 index;
|
||||
} ladspaManagerDescription;
|
||||
|
||||
|
||||
typedef QMap<ladspaKey, ladspaManagerDescription *> ladspaManagerMapType;
|
||||
ladspaManagerMapType m_ladspaManagerMap;
|
||||
};
|
||||
|
||||
} ;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ public:
|
||||
SONG_PROJECT,
|
||||
SONG_PROJECT_TEMPLATE,
|
||||
CHANNEL_SETTINGS,
|
||||
DRAG_N_DROP_DATA,
|
||||
EFFECT_SETTINGS,
|
||||
VIDEO_PROJECT, // will come later...
|
||||
BURN_PROJECT, // will come later...
|
||||
@@ -59,7 +60,8 @@ public:
|
||||
} ;
|
||||
|
||||
|
||||
multimediaProject( const QString & _in_file_name );
|
||||
multimediaProject( const QString & _in_file_name,
|
||||
bool _is_filename = TRUE );
|
||||
multimediaProject( projectTypes _project_type );
|
||||
~multimediaProject();
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ public:
|
||||
// phase (otherwise we'll get clicks in the audio-stream)
|
||||
const float v = m_sample * m_oscCoeff;
|
||||
m_freq = _new_freq;
|
||||
recalcOscCoeff( phase( v ) );
|
||||
recalcOscCoeff( fraction( v ) );
|
||||
}
|
||||
|
||||
static oscillator * FASTCALL createOsc( waveShapes _wave_shape,
|
||||
@@ -112,14 +112,14 @@ public:
|
||||
// check whether v2 is in next period
|
||||
return( floorf( v2 ) > floorf( v1 ) );
|
||||
}
|
||||
#define FLOAT_TO_INT(in,out) \
|
||||
/*#define FLOAT_TO_INT(in,out) \
|
||||
register const float round_const = -0.5f; \
|
||||
__asm__ __volatile__ ("fadd %%st,%%st(0)\n" \
|
||||
"fadd %2\n" \
|
||||
"fistpl %0\n" \
|
||||
"shrl $1,%0" : "=m" (out) : "t" (in),"m"(round_const) : "st") ;
|
||||
"shrl $1,%0" : "=m" (out) : "t" (in),"m"(round_const) : "st") ;*/
|
||||
|
||||
static inline float phase( const float _sample )
|
||||
static inline float fraction( const float _sample )
|
||||
{
|
||||
return( _sample - static_cast<int>( _sample ) );
|
||||
}
|
||||
@@ -134,7 +134,7 @@ public:
|
||||
|
||||
static inline sampleType triangleSample( float _sample )
|
||||
{
|
||||
const float ph = phase( _sample );
|
||||
const float ph = fraction( _sample );
|
||||
if( ph <= 0.25f )
|
||||
{
|
||||
return( ph * 4.0f );
|
||||
@@ -148,17 +148,17 @@ public:
|
||||
|
||||
static inline sampleType sawSample( float _sample )
|
||||
{
|
||||
return( -1.0f + phase( _sample ) * 2.0f );
|
||||
return( -1.0f + fraction( _sample ) * 2.0f );
|
||||
}
|
||||
|
||||
static inline sampleType squareSample( float _sample )
|
||||
{
|
||||
return( ( phase( _sample ) > 0.5f ) ? -1.0f : 1.0f );
|
||||
return( ( fraction( _sample ) > 0.5f ) ? -1.0f : 1.0f );
|
||||
}
|
||||
|
||||
static inline sampleType moogSawSample( float _sample )
|
||||
{
|
||||
const float ph = phase( _sample );
|
||||
const float ph = fraction( _sample );
|
||||
if( ph < 0.5f )
|
||||
{
|
||||
return( -1.0f + ph * 4.0f );
|
||||
@@ -168,7 +168,7 @@ public:
|
||||
|
||||
static inline sampleType expSample( float _sample )
|
||||
{
|
||||
float ph = phase( _sample );
|
||||
float ph = fraction( _sample );
|
||||
if( ph > 0.5f )
|
||||
{
|
||||
ph = 1.0f - ph;
|
||||
@@ -181,14 +181,20 @@ public:
|
||||
return( 1.0f - 2.0f * ( ( float )rand() * ( 1.0f /
|
||||
RAND_MAX ) ) );
|
||||
}
|
||||
static inline sampleType userWaveSample( float _sample,
|
||||
const sampleFrame * _user_wave, Uint32 _user_wave_frames )
|
||||
{
|
||||
const float frame = fraction( _sample ) * _user_wave_frames;
|
||||
const Uint32 f1 = static_cast<Uint32>( frame );
|
||||
const Uint32 f2 = ( f1 + 1 ) % _user_wave_frames;
|
||||
return( linearInterpolate( _user_wave[f1][0],
|
||||
_user_wave[f2][0],
|
||||
fraction( frame ) ) );
|
||||
}
|
||||
inline sampleType userWaveSample( float _sample )
|
||||
{
|
||||
const float frame = phase( _sample ) * m_userWaveFrames;
|
||||
const Uint32 f1 = static_cast<Uint32>( frame );
|
||||
const Uint32 f2 = ( f1 + 1 ) % m_userWaveFrames;
|
||||
return( linearInterpolate( m_userWaveData[f1][0],
|
||||
m_userWaveData[f2][0],
|
||||
frame - floorf( frame ) ) );
|
||||
return( userWaveSample( _sample, m_userWaveData,
|
||||
m_userWaveFrames ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -102,13 +102,20 @@ public:
|
||||
return( m_notes );
|
||||
}
|
||||
|
||||
note * FASTCALL noteAt( int _note_num );
|
||||
|
||||
void FASTCALL setNoteAt( int _note_num, note _new_note );
|
||||
|
||||
// pattern-type stuff
|
||||
inline patternTypes type( void ) const
|
||||
{
|
||||
return( m_patternType );
|
||||
}
|
||||
void FASTCALL setType( patternTypes _new_pattern_type );
|
||||
void checkType( void );
|
||||
|
||||
|
||||
// pattern-name functions
|
||||
inline const QString & name( void ) const
|
||||
{
|
||||
return( m_name );
|
||||
@@ -121,12 +128,6 @@ public:
|
||||
}
|
||||
|
||||
|
||||
inline channelTrack * getChannelTrack( void )
|
||||
{
|
||||
return( m_channelTrack );
|
||||
}
|
||||
|
||||
|
||||
// functions which are part of freezing-feature
|
||||
inline bool freezing( void ) const
|
||||
{
|
||||
@@ -143,11 +144,7 @@ public:
|
||||
void FASTCALL playFrozenData( sampleFrame * _ab, Uint32 _start_frame,
|
||||
Uint32 _frames );
|
||||
|
||||
|
||||
note * FASTCALL noteAt( int _note_num );
|
||||
void FASTCALL setNoteAt( int _note_num, note _new_note );
|
||||
void checkType( void );
|
||||
|
||||
// settings-management
|
||||
virtual void FASTCALL saveSettings( QDomDocument & _doc,
|
||||
QDomElement & _parent );
|
||||
virtual void FASTCALL loadSettings( const QDomElement & _this );
|
||||
@@ -156,6 +153,11 @@ public:
|
||||
return( "pattern" );
|
||||
}
|
||||
|
||||
inline channelTrack * getChannelTrack( void )
|
||||
{
|
||||
return( m_channelTrack );
|
||||
}
|
||||
|
||||
|
||||
protected slots:
|
||||
void openInPianoRoll( bool _c );
|
||||
@@ -175,12 +177,13 @@ protected slots:
|
||||
|
||||
|
||||
protected:
|
||||
void paintEvent( QPaintEvent * _pe );
|
||||
void mousePressEvent( QMouseEvent * _me );
|
||||
void mouseDoubleClickEvent( QMouseEvent * _me );
|
||||
virtual void constructContextMenu( QMenu * );
|
||||
virtual void mouseDoubleClickEvent( QMouseEvent * _me );
|
||||
virtual void mousePressEvent( QMouseEvent * _me );
|
||||
virtual void paintEvent( QPaintEvent * _pe );
|
||||
|
||||
void ensureBeatNotes( void );
|
||||
void updateBBTrack( void );
|
||||
|
||||
|
||||
private:
|
||||
|
||||
@@ -90,7 +90,6 @@ protected:
|
||||
void mouseReleaseEvent( QMouseEvent * _me );
|
||||
void mouseMoveEvent( QMouseEvent * _me );
|
||||
void keyPressEvent( QKeyEvent * _ke );
|
||||
void keyReleaseEvent( QKeyEvent * _ke );
|
||||
void wheelEvent( QWheelEvent * _we );
|
||||
|
||||
int FASTCALL getKey( int _y );
|
||||
@@ -211,9 +210,6 @@ private:
|
||||
|
||||
midiTime m_lenOfNewNotes;
|
||||
|
||||
bool m_shiftPressed;
|
||||
bool m_controlPressed;
|
||||
|
||||
int m_startKey; // first key when drawing
|
||||
int m_keyMouseOver;
|
||||
int m_lastKey;
|
||||
|
||||
@@ -52,10 +52,16 @@ class pixmapButton : public QPushButton
|
||||
public:
|
||||
pixmapButton( QWidget * _parent );
|
||||
virtual ~pixmapButton();
|
||||
virtual void FASTCALL setActiveGraphic( const QPixmap & _pm );
|
||||
virtual void FASTCALL setInactiveGraphic( const QPixmap & _pm,
|
||||
void FASTCALL setActiveGraphic( const QPixmap & _pm );
|
||||
void FASTCALL setInactiveGraphic( const QPixmap & _pm,
|
||||
bool _update = TRUE );
|
||||
void FASTCALL setBgGraphic( const QPixmap & _pm );
|
||||
#ifndef QT4
|
||||
inline void setChecked( bool _on )
|
||||
{
|
||||
setOn( _on );
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
signals:
|
||||
|
||||
@@ -67,7 +67,10 @@ public:
|
||||
DOTS
|
||||
} ;
|
||||
|
||||
sampleBuffer( const QString & _audio_file = "" );
|
||||
// constructor which either loads sample _audio_file or decodes
|
||||
// base64-data out of string
|
||||
sampleBuffer( const QString & _audio_file = "",
|
||||
bool _is_base64_data = FALSE );
|
||||
sampleBuffer( const sampleFrame * _data, Uint32 _frames );
|
||||
|
||||
~sampleBuffer();
|
||||
@@ -112,10 +115,12 @@ public:
|
||||
|
||||
QString openAudioFile( void ) const;
|
||||
|
||||
QString toBase64( void ) const;
|
||||
|
||||
|
||||
public slots:
|
||||
void setAudioFile( const QString & _audio_file );
|
||||
void loadFromBase64( const QString & _data );
|
||||
void setStartFrame( Uint32 _s );
|
||||
void setEndFrame( Uint32 _e );
|
||||
void setAmplification( float _a );
|
||||
|
||||
@@ -77,8 +77,11 @@ public slots:
|
||||
|
||||
|
||||
protected:
|
||||
void paintEvent( QPaintEvent * );
|
||||
void mouseDoubleClickEvent( QMouseEvent * );
|
||||
virtual void dragEnterEvent( QDragEnterEvent * _dee );
|
||||
virtual void dropEvent( QDropEvent * _de );
|
||||
virtual void mouseDoubleClickEvent( QMouseEvent * );
|
||||
virtual void paintEvent( QPaintEvent * );
|
||||
|
||||
midiTime getSampleLength( void ) const;
|
||||
|
||||
|
||||
@@ -122,7 +125,7 @@ public:
|
||||
sampleTrack( trackContainer * _tc );
|
||||
virtual ~sampleTrack();
|
||||
|
||||
virtual trackTypes trackType( void ) const;
|
||||
virtual trackTypes type( void ) const;
|
||||
virtual bool FASTCALL play( const midiTime & _start,
|
||||
Uint32 _start_frame, Uint32 _frames,
|
||||
Uint32 _frame_base,
|
||||
|
||||
@@ -27,26 +27,12 @@
|
||||
#ifndef _SONG_EDITOR_H
|
||||
#define _SONG_EDITOR_H
|
||||
|
||||
#include "qt3support.h"
|
||||
|
||||
#ifdef QT4
|
||||
|
||||
#include <QMap>
|
||||
|
||||
#else
|
||||
|
||||
#include <qmap.h>
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#include "track_container.h"
|
||||
#include "types.h"
|
||||
|
||||
|
||||
class QComboBox;
|
||||
class QLabel;
|
||||
class QPixmap;
|
||||
class QScrollBar;
|
||||
class QSlider;
|
||||
|
||||
@@ -301,6 +287,8 @@ private:
|
||||
volatile bool m_playing;
|
||||
volatile bool m_paused;
|
||||
|
||||
bool m_loadingProject;
|
||||
|
||||
playModes m_playMode;
|
||||
playPos m_playPos[PLAY_MODE_CNT];
|
||||
|
||||
@@ -325,11 +313,6 @@ private:
|
||||
void doActions( void );
|
||||
|
||||
|
||||
bool m_shiftPressed;
|
||||
bool m_controlPressed;
|
||||
|
||||
|
||||
|
||||
friend class lmmsMainWin;
|
||||
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ public:
|
||||
const QPixmap & _icon, QWidget * _w );
|
||||
~stringPairDrag();
|
||||
|
||||
static void processDragEnterEvent( QDragEnterEvent * _dee,
|
||||
static bool processDragEnterEvent( QDragEnterEvent * _dee,
|
||||
const QString & _allowed_keys );
|
||||
static QString decodeKey( QDropEvent * _de );
|
||||
static QString decodeValue( QDropEvent * _de );
|
||||
|
||||
@@ -76,6 +76,8 @@ protected:
|
||||
|
||||
|
||||
private:
|
||||
void updateSize( void );
|
||||
|
||||
QString m_title;
|
||||
QString m_text;
|
||||
QPixmap m_pixmap;
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
|
||||
class QPixmap;
|
||||
class nStateButton;
|
||||
class textFloat;
|
||||
|
||||
|
||||
class timeLine : public QWidget
|
||||
@@ -90,6 +91,7 @@ public:
|
||||
return( ( m_loopPos[0] < m_loopPos[1] ) ?
|
||||
m_loopPos[0] : m_loopPos[1] );
|
||||
}
|
||||
|
||||
inline const midiTime & loopEnd( void ) const
|
||||
{
|
||||
return( ( m_loopPos[0] > m_loopPos[1] ) ?
|
||||
@@ -136,6 +138,7 @@ private:
|
||||
m_ppt / 64.0f ) );
|
||||
}
|
||||
|
||||
|
||||
static QPixmap * s_timeLinePixmap;
|
||||
static QPixmap * s_posMarkerPixmap;
|
||||
static QPixmap * s_loopPointPixmap;
|
||||
@@ -157,6 +160,9 @@ private:
|
||||
midiTime m_savedPos;
|
||||
|
||||
|
||||
textFloat * m_hint;
|
||||
|
||||
|
||||
enum actions
|
||||
{
|
||||
NONE, MOVE_POS_MARKER, MOVE_LOOP_BEGIN, MOVE_LOOP_END
|
||||
|
||||
@@ -57,14 +57,15 @@
|
||||
#include "settings.h"
|
||||
|
||||
|
||||
class QMenu;
|
||||
|
||||
class pixmapButton;
|
||||
class textFloat;
|
||||
class track;
|
||||
class trackContainer;
|
||||
class trackContentWidget;
|
||||
class trackWidget;
|
||||
class pixmapButton;
|
||||
class QMenu;
|
||||
|
||||
typedef QWidget trackSettingsWidget;
|
||||
typedef QWidget trackOperationsWidget;
|
||||
|
||||
|
||||
@@ -107,13 +108,17 @@ public slots:
|
||||
|
||||
|
||||
protected:
|
||||
virtual void mousePressEvent( QMouseEvent * _me );
|
||||
virtual void mouseMoveEvent( QMouseEvent * _me );
|
||||
virtual void mouseReleaseEvent( QMouseEvent * _me );
|
||||
virtual void contextMenuEvent( QContextMenuEvent * _cme );
|
||||
virtual void constructContextMenu( QMenu * )
|
||||
{
|
||||
}
|
||||
virtual void contextMenuEvent( QContextMenuEvent * _cme );
|
||||
virtual void dragEnterEvent( QDragEnterEvent * _dee );
|
||||
virtual void dropEvent( QDropEvent * _de );
|
||||
virtual void leaveEvent( QEvent * _e );
|
||||
virtual void mouseMoveEvent( QMouseEvent * _me );
|
||||
virtual void mousePressEvent( QMouseEvent * _me );
|
||||
virtual void mouseReleaseEvent( QMouseEvent * _me );
|
||||
|
||||
void setAutoResizeEnabled( bool _e = FALSE );
|
||||
float pixelsPerTact( void );
|
||||
|
||||
@@ -125,6 +130,8 @@ protected slots:
|
||||
|
||||
|
||||
private:
|
||||
static textFloat * s_textFloat;
|
||||
|
||||
track * m_track;
|
||||
midiTime m_startPosition;
|
||||
midiTime m_length;
|
||||
@@ -172,6 +179,8 @@ public slots:
|
||||
|
||||
|
||||
protected:
|
||||
virtual void dragEnterEvent( QDragEnterEvent * _dee );
|
||||
virtual void dropEvent( QDropEvent * _de );
|
||||
virtual void mousePressEvent( QMouseEvent * _me );
|
||||
virtual void mouseMoveEvent( QMouseEvent * _me );
|
||||
virtual void mouseReleaseEvent( QMouseEvent * _me );
|
||||
@@ -179,6 +188,9 @@ protected:
|
||||
|
||||
|
||||
private:
|
||||
track * getTrack( void );
|
||||
midiTime getPosition( int _mouse_x );
|
||||
|
||||
typedef vvector<trackContentObject *> tcoVector;
|
||||
|
||||
tcoVector m_trackContentObjects;
|
||||
@@ -190,6 +202,28 @@ private:
|
||||
|
||||
|
||||
|
||||
|
||||
class trackSettingsWidget : public QWidget
|
||||
{
|
||||
public:
|
||||
trackSettingsWidget( trackWidget * _parent );
|
||||
~trackSettingsWidget();
|
||||
|
||||
|
||||
protected:
|
||||
virtual void mousePressEvent( QMouseEvent * _me );
|
||||
|
||||
|
||||
private:
|
||||
trackWidget * m_trackWidget;
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// actual widget shown in trackContainer
|
||||
class trackWidget : public QWidget
|
||||
{
|
||||
@@ -202,26 +236,32 @@ public:
|
||||
{
|
||||
return( m_track );
|
||||
}
|
||||
|
||||
inline track * getTrack( void )
|
||||
{
|
||||
return( m_track );
|
||||
}
|
||||
|
||||
inline const trackSettingsWidget & getTrackSettingsWidget( void ) const
|
||||
{
|
||||
return( m_trackSettingsWidget );
|
||||
}
|
||||
|
||||
inline const trackContentWidget & getTrackContentWidget( void ) const
|
||||
{
|
||||
return( m_trackContentWidget );
|
||||
}
|
||||
|
||||
inline trackSettingsWidget & getTrackSettingsWidget( void )
|
||||
{
|
||||
return( m_trackSettingsWidget );
|
||||
}
|
||||
|
||||
inline trackContentWidget & getTrackContentWidget( void )
|
||||
{
|
||||
return( m_trackContentWidget );
|
||||
}
|
||||
|
||||
bool muted( void ) const;
|
||||
|
||||
|
||||
@@ -236,8 +276,11 @@ public slots:
|
||||
|
||||
|
||||
protected:
|
||||
virtual void resizeEvent( QResizeEvent * _re );
|
||||
virtual void dragEnterEvent( QDragEnterEvent * _dee );
|
||||
virtual void dropEvent( QDropEvent * _de );
|
||||
virtual void paintEvent( QPaintEvent * _pe );
|
||||
virtual void resizeEvent( QResizeEvent * _re );
|
||||
|
||||
midiTime FASTCALL endPosition( const midiTime & _pos_start );
|
||||
|
||||
|
||||
@@ -285,7 +328,7 @@ public:
|
||||
}
|
||||
|
||||
// pure virtual functions
|
||||
virtual trackTypes trackType( void ) const = 0;
|
||||
virtual trackTypes type( void ) const = 0;
|
||||
|
||||
virtual bool FASTCALL play( const midiTime & _start,
|
||||
Uint32 _start_frame,
|
||||
@@ -322,22 +365,27 @@ public:
|
||||
{
|
||||
return( m_trackWidget );
|
||||
}
|
||||
|
||||
inline trackContainer * getTrackContainer( void )
|
||||
{
|
||||
return( m_trackContainer );
|
||||
}
|
||||
|
||||
inline const trackSettingsWidget * getTrackSettingsWidget( void ) const
|
||||
{
|
||||
return( &m_trackWidget->getTrackSettingsWidget() );
|
||||
}
|
||||
|
||||
inline const trackContentWidget * getTrackContentWidget( void ) const
|
||||
{
|
||||
return( &m_trackWidget->getTrackContentWidget() );
|
||||
}
|
||||
|
||||
inline trackSettingsWidget * getTrackSettingsWidget( void )
|
||||
{
|
||||
return( &m_trackWidget->getTrackSettingsWidget() );
|
||||
}
|
||||
|
||||
inline trackContentWidget * getTrackContentWidget( void )
|
||||
{
|
||||
return( &m_trackWidget->getTrackContentWidget() );
|
||||
|
||||
@@ -94,9 +94,9 @@ public:
|
||||
|
||||
|
||||
protected:
|
||||
virtual void resizeEvent( QResizeEvent * );
|
||||
virtual void dragEnterEvent( QDragEnterEvent * _dee );
|
||||
virtual void dropEvent( QDropEvent * _de );
|
||||
virtual void resizeEvent( QResizeEvent * );
|
||||
|
||||
constTrackVector tracks( void ) const;
|
||||
trackVector tracks( void );
|
||||
|
||||
@@ -57,6 +57,8 @@
|
||||
#include "pixmap_button.h"
|
||||
#include "knob.h"
|
||||
#include "tooltip.h"
|
||||
#include "string_pair_drag.h"
|
||||
#include "mmp.h"
|
||||
|
||||
#include "embed.cpp"
|
||||
|
||||
@@ -277,6 +279,7 @@ audioFileProcessor::audioFileProcessor( channelTrack * _channel_track ) :
|
||||
|
||||
setBackgroundMode( Qt::NoBackground );
|
||||
#endif
|
||||
setAcceptDrops( TRUE );
|
||||
}
|
||||
|
||||
|
||||
@@ -413,6 +416,36 @@ void audioFileProcessor::deleteNotePluginData( notePlayHandle * _n )
|
||||
|
||||
|
||||
|
||||
void audioFileProcessor::dragEnterEvent( QDragEnterEvent * _dee )
|
||||
{
|
||||
stringPairDrag::processDragEnterEvent( _dee,
|
||||
QString( "samplefile,tco_%1" ).arg( track::SAMPLE_TRACK ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void audioFileProcessor::dropEvent( QDropEvent * _de )
|
||||
{
|
||||
QString type = stringPairDrag::decodeKey( _de );
|
||||
QString value = stringPairDrag::decodeValue( _de );
|
||||
if( type == "samplefile" )
|
||||
{
|
||||
setAudioFile( stringPairDrag::decodeValue( _de ) );
|
||||
_de->accept();
|
||||
}
|
||||
else if( type == QString( "tco_%1" ).arg( track::SAMPLE_TRACK ) )
|
||||
{
|
||||
multimediaProject mmp( value, FALSE );
|
||||
setAudioFile( mmp.content().firstChild().toElement().
|
||||
attribute( "src" ) );
|
||||
_de->accept();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void audioFileProcessor::paintEvent( QPaintEvent * )
|
||||
{
|
||||
#ifdef QT4
|
||||
@@ -493,6 +526,7 @@ void audioFileProcessor::sampleUpdated( void )
|
||||
m_graph.height() );
|
||||
QPainter p( &m_graph );
|
||||
#endif
|
||||
p.setPen( QColor( 64, 255, 160 ) );
|
||||
m_sampleBuffer.drawWaves( p, QRect( 2, 2, m_graph.width() - 4,
|
||||
m_graph.height() - 4 ),
|
||||
m_drawMethod );
|
||||
|
||||
@@ -86,7 +86,9 @@ protected slots:
|
||||
|
||||
|
||||
protected:
|
||||
void paintEvent( QPaintEvent * );
|
||||
virtual void dragEnterEvent( QDragEnterEvent * _dee );
|
||||
virtual void dropEvent( QDropEvent * _de );
|
||||
virtual void paintEvent( QPaintEvent * );
|
||||
|
||||
|
||||
private:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
AUTOMAKE_OPTIONS = foreign 1.4
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I.
|
||||
INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. -I/usr/X11R6/include
|
||||
|
||||
|
||||
AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="vestige"
|
||||
|
||||
BIN
resources/hint.png
Normal file
BIN
resources/hint.png
Normal file
Binary file not shown.
BIN
resources/midi_file.png
Normal file
BIN
resources/midi_file.png
Normal file
Binary file not shown.
@@ -258,6 +258,18 @@ void bbEditor::removeBB( csize _bb )
|
||||
|
||||
|
||||
|
||||
void bbEditor::updateBBTrack( trackContentObject * _tco )
|
||||
{
|
||||
bbTrack * t = bbTrack::findBBTrack( _tco->startPosition() / 64 );
|
||||
if( t != NULL )
|
||||
{
|
||||
t->getTrackContentWidget()->updateTCOs();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// close-handler for bb-editor-window because closing of bb-editor isn't allowed
|
||||
// instead of closing it's being hidden
|
||||
void bbEditor::closeEvent( QCloseEvent * _ce )
|
||||
|
||||
@@ -58,6 +58,11 @@
|
||||
#include "gui_templates.h"
|
||||
#include "led_checkbox.h"
|
||||
#include "tempo_sync_knob.h"
|
||||
#include "string_pair_drag.h"
|
||||
#include "mmp.h"
|
||||
#include "text_float.h"
|
||||
|
||||
|
||||
|
||||
// how long should be each envelope-segment maximal (e.g. attack)?
|
||||
const float SECS_PER_ENV_SEGMENT = 5.0f;
|
||||
@@ -65,33 +70,32 @@ const float SECS_PER_ENV_SEGMENT = 5.0f;
|
||||
const float SECS_PER_LFO_OSCILLATION = 20.0f;
|
||||
|
||||
|
||||
const int env_graph_x = 6;
|
||||
const int env_graph_y = 6;
|
||||
const int ENV_GRAPH_X = 6;
|
||||
const int ENV_GRAPH_Y = 6;
|
||||
|
||||
const int env_knobs_y = 43;
|
||||
const int env_knobs_lbl_y = env_knobs_y+35;
|
||||
const int knob_x_spacing = 32;
|
||||
const int predelay_knob_x = 6;
|
||||
const int attack_knob_x = predelay_knob_x+knob_x_spacing;
|
||||
const int hold_knob_x = attack_knob_x+knob_x_spacing;
|
||||
const int decay_knob_x = hold_knob_x+knob_x_spacing;
|
||||
const int sustain_knob_x = decay_knob_x+knob_x_spacing;
|
||||
const int release_knob_x = sustain_knob_x+knob_x_spacing;
|
||||
const int amount_knob_x = release_knob_x+knob_x_spacing;
|
||||
const int ENV_KNOBS_Y = 43;
|
||||
const int ENV_KNOBS_LBL_Y = ENV_KNOBS_Y+35;
|
||||
const int KNOB_X_SPACING = 32;
|
||||
const int PREDELAY_KNOB_X = 6;
|
||||
const int ATTACK_KNOB_X = PREDELAY_KNOB_X+KNOB_X_SPACING;
|
||||
const int HOLD_KNOB_X = ATTACK_KNOB_X+KNOB_X_SPACING;
|
||||
const int DECAY_KNOB_X = HOLD_KNOB_X+KNOB_X_SPACING;
|
||||
const int SUSTAIN_KNOB_X = DECAY_KNOB_X+KNOB_X_SPACING;
|
||||
const int RELEASE_KNOB_X = SUSTAIN_KNOB_X+KNOB_X_SPACING;
|
||||
const int AMOUNT_KNOB_X = RELEASE_KNOB_X+KNOB_X_SPACING;
|
||||
|
||||
const float time_unit_width = 36.0;
|
||||
const float TIME_UNIT_WIDTH = 36.0;
|
||||
|
||||
|
||||
const int lfo_graph_x = 6;
|
||||
const int lfo_graph_y = env_knobs_lbl_y+14;
|
||||
const int lfo_knob_y = lfo_graph_y-2;
|
||||
const int lfo_knobs_lbl_y = lfo_knob_y+35;
|
||||
const int lfo_predelay_knob_x = lfo_graph_x + 100;
|
||||
const int lfo_attack_knob_x = lfo_predelay_knob_x+knob_x_spacing;
|
||||
const int lfo_speed_knob_x = lfo_attack_knob_x+knob_x_spacing;
|
||||
const int lfo_amount_knob_x = lfo_speed_knob_x+knob_x_spacing;
|
||||
const int lfo_shapes_x = lfo_graph_x;//predelay_knob_x;
|
||||
const int lfo_shapes_y = lfo_graph_y + 50;
|
||||
const int LFO_GRAPH_X = 6;
|
||||
const int LFO_GRAPH_Y = ENV_KNOBS_LBL_Y+14;
|
||||
const int LFO_KNOB_Y = LFO_GRAPH_Y-2;
|
||||
const int LFO_PREDELAY_KNOB_X = LFO_GRAPH_X + 100;
|
||||
const int LFO_ATTACK_KNOB_X = LFO_PREDELAY_KNOB_X+KNOB_X_SPACING;
|
||||
const int LFO_SPEED_KNOB_X = LFO_ATTACK_KNOB_X+KNOB_X_SPACING;
|
||||
const int LFO_AMOUNT_KNOB_X = LFO_SPEED_KNOB_X+KNOB_X_SPACING;
|
||||
const int LFO_SHAPES_X = LFO_GRAPH_X;//PREDELAY_KNOB_X;
|
||||
const int LFO_SHAPES_Y = LFO_GRAPH_Y + 50;
|
||||
|
||||
|
||||
QPixmap * envelopeAndLFOWidget::s_envGraph = NULL;
|
||||
@@ -132,7 +136,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
m_predelayKnob->setLabel( tr( "DEL" ) );
|
||||
m_predelayKnob->setRange( 0.0, 1.0, 0.001 );
|
||||
m_predelayKnob->setValue( 0.0, TRUE );
|
||||
m_predelayKnob->move( predelay_knob_x, env_knobs_y );
|
||||
m_predelayKnob->move( PREDELAY_KNOB_X, ENV_KNOBS_Y );
|
||||
m_predelayKnob->setHintText( tr( "Predelay:" ) + " ", "" );
|
||||
#ifdef QT4
|
||||
m_predelayKnob->setWhatsThis(
|
||||
@@ -149,7 +153,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
m_attackKnob->setLabel( tr( "ATT" ) );
|
||||
m_attackKnob->setRange( 0.0, 1.0, 0.001 );
|
||||
m_attackKnob->setValue( 0.0, TRUE );
|
||||
m_attackKnob->move( attack_knob_x, env_knobs_y );
|
||||
m_attackKnob->move( ATTACK_KNOB_X, ENV_KNOBS_Y );
|
||||
m_attackKnob->setHintText( tr( "Attack:" )+" ", "" );
|
||||
#ifdef QT4
|
||||
m_attackKnob->setWhatsThis(
|
||||
@@ -168,7 +172,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
m_holdKnob->setLabel( tr( "HOLD" ) );
|
||||
m_holdKnob->setRange( 0.0, 1.0, 0.001 );
|
||||
m_holdKnob->setValue( 0.5, TRUE );
|
||||
m_holdKnob->move( hold_knob_x, env_knobs_y );
|
||||
m_holdKnob->move( HOLD_KNOB_X, ENV_KNOBS_Y );
|
||||
m_holdKnob->setHintText( tr( "Hold:" ) + " ", "" );
|
||||
#ifdef QT4
|
||||
m_holdKnob->setWhatsThis(
|
||||
@@ -186,7 +190,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
m_decayKnob->setLabel( tr( "DEC" ) );
|
||||
m_decayKnob->setRange( 0.0, 1.0, 0.001 );
|
||||
m_decayKnob->setValue( 0.5, TRUE );
|
||||
m_decayKnob->move( decay_knob_x, env_knobs_y );
|
||||
m_decayKnob->move( DECAY_KNOB_X, ENV_KNOBS_Y );
|
||||
m_decayKnob->setHintText( tr( "Decay:" ) + " ", "" );
|
||||
#ifdef QT4
|
||||
m_decayKnob->setWhatsThis(
|
||||
@@ -205,7 +209,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
m_sustainKnob->setLabel( tr( "SUST" ) );
|
||||
m_sustainKnob->setRange( 0.0, 1.0, 0.001 );
|
||||
m_sustainKnob->setValue( 0.5, TRUE );
|
||||
m_sustainKnob->move( sustain_knob_x, env_knobs_y );
|
||||
m_sustainKnob->move( SUSTAIN_KNOB_X, ENV_KNOBS_Y );
|
||||
m_sustainKnob->setHintText( tr( "Sustain:" ) + " ", "" );
|
||||
#ifdef QT4
|
||||
m_sustainKnob->setWhatsThis(
|
||||
@@ -223,7 +227,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
m_releaseKnob->setLabel( tr( "REL" ) );
|
||||
m_releaseKnob->setRange( 0.0, 1.0, 0.001 );
|
||||
m_releaseKnob->setValue( 0.1, TRUE );
|
||||
m_releaseKnob->move( release_knob_x, env_knobs_y );
|
||||
m_releaseKnob->move( RELEASE_KNOB_X, ENV_KNOBS_Y );
|
||||
m_releaseKnob->setHintText( tr( "Release:" ) + " ", "" );
|
||||
#ifdef QT4
|
||||
m_releaseKnob->setWhatsThis(
|
||||
@@ -243,7 +247,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
m_amountKnob->setLabel( tr( "AMT" ) );
|
||||
m_amountKnob->setRange( -1.0, 1.0, 0.005 );
|
||||
m_amountKnob->setValue( 0.0, TRUE );
|
||||
m_amountKnob->move( amount_knob_x, env_graph_y );
|
||||
m_amountKnob->move( AMOUNT_KNOB_X, ENV_GRAPH_Y );
|
||||
m_amountKnob->setHintText( tr( "Modulation amount:" ) + " ", "" );
|
||||
#ifdef QT4
|
||||
m_amountKnob->setWhatsThis(
|
||||
@@ -264,7 +268,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
m_lfoPredelayKnob->setLabel( tr( "DEL" ) );
|
||||
m_lfoPredelayKnob->setRange( 0.0, 1.0, 0.001 );
|
||||
m_lfoPredelayKnob->setValue( 0.0, TRUE );
|
||||
m_lfoPredelayKnob->move( lfo_predelay_knob_x, lfo_knob_y );
|
||||
m_lfoPredelayKnob->move( LFO_PREDELAY_KNOB_X, LFO_KNOB_Y );
|
||||
m_lfoPredelayKnob->setHintText( tr( "LFO-predelay:" ) + " ", "" );
|
||||
#ifdef QT4
|
||||
m_lfoPredelayKnob->setWhatsThis(
|
||||
@@ -282,7 +286,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
m_lfoAttackKnob->setLabel( tr( "ATT" ) );
|
||||
m_lfoAttackKnob->setRange( 0.0, 1.0, 0.001 );
|
||||
m_lfoAttackKnob->setValue( 0.0, TRUE );
|
||||
m_lfoAttackKnob->move( lfo_attack_knob_x, lfo_knob_y );
|
||||
m_lfoAttackKnob->move( LFO_ATTACK_KNOB_X, LFO_KNOB_Y );
|
||||
m_lfoAttackKnob->setHintText( tr( "LFO-attack:" ) + " ", "" );
|
||||
#ifdef QT4
|
||||
m_lfoAttackKnob->setWhatsThis(
|
||||
@@ -295,12 +299,12 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
connect( m_lfoAttackKnob, SIGNAL( valueChanged( float ) ), this,
|
||||
SLOT( updateAfterKnobChange( float ) ) );
|
||||
|
||||
m_lfoSpeedKnob = new tempoSyncKnob( knobBright_26, this, tr( "LFO-speed" ) ,
|
||||
20000.0 );
|
||||
m_lfoSpeedKnob = new tempoSyncKnob( knobBright_26, this,
|
||||
tr( "LFO-speed" ), 20000.0 );
|
||||
m_lfoSpeedKnob->setLabel( tr( "SPD" ) );
|
||||
m_lfoSpeedKnob->setRange( 0.01, 1.0, 0.0001 );
|
||||
m_lfoSpeedKnob->setValue( 0.1, TRUE );
|
||||
m_lfoSpeedKnob->move( lfo_speed_knob_x, lfo_knob_y );
|
||||
m_lfoSpeedKnob->move( LFO_SPEED_KNOB_X, LFO_KNOB_Y );
|
||||
m_lfoSpeedKnob->setHintText( tr( "LFO-speed:" ) + " ", "" );
|
||||
#ifdef QT4
|
||||
m_lfoSpeedKnob->setWhatsThis(
|
||||
@@ -318,7 +322,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
m_lfoAmountKnob->setLabel( tr( "AMT" ) );
|
||||
m_lfoAmountKnob->setRange( -1.0, 1.0, 0.005 );
|
||||
m_lfoAmountKnob->setValue( 0.0, TRUE );
|
||||
m_lfoAmountKnob->move( lfo_amount_knob_x, lfo_knob_y );
|
||||
m_lfoAmountKnob->move( LFO_AMOUNT_KNOB_X, LFO_KNOB_Y );
|
||||
m_lfoAmountKnob->setHintText( tr( "Modulation amount:" ) + " ", "" );
|
||||
#ifdef QT4
|
||||
m_lfoAmountKnob->setWhatsThis(
|
||||
@@ -334,23 +338,22 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
|
||||
|
||||
m_sinLfoBtn = new pixmapButton( this );
|
||||
m_sinLfoBtn->move( lfo_shapes_x, lfo_shapes_y );
|
||||
m_sinLfoBtn->move( LFO_SHAPES_X, LFO_SHAPES_Y );
|
||||
m_sinLfoBtn->setActiveGraphic( embed::getIconPixmap(
|
||||
"sin_wave_active" ) );
|
||||
m_sinLfoBtn->setInactiveGraphic( embed::getIconPixmap(
|
||||
"sin_wave_inactive" ) );
|
||||
#ifdef QT4
|
||||
m_sinLfoBtn->setChecked( TRUE );
|
||||
#ifdef QT4
|
||||
m_sinLfoBtn->setWhatsThis(
|
||||
#else
|
||||
m_sinLfoBtn->setOn( TRUE );
|
||||
QWhatsThis::add( m_sinLfoBtn,
|
||||
#endif
|
||||
tr( "Click here if you want a sine-wave for current "
|
||||
"oscillator." ) );
|
||||
|
||||
m_triangleLfoBtn = new pixmapButton( this );
|
||||
m_triangleLfoBtn->move( lfo_shapes_x+15, lfo_shapes_y );
|
||||
m_triangleLfoBtn->move( LFO_SHAPES_X+15, LFO_SHAPES_Y );
|
||||
m_triangleLfoBtn->setActiveGraphic( embed::getIconPixmap(
|
||||
"triangle_wave_active" ) );
|
||||
m_triangleLfoBtn->setInactiveGraphic( embed::getIconPixmap(
|
||||
@@ -364,7 +367,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
"oscillator." ) );
|
||||
|
||||
m_sawLfoBtn = new pixmapButton( this );
|
||||
m_sawLfoBtn->move( lfo_shapes_x+30, lfo_shapes_y );
|
||||
m_sawLfoBtn->move( LFO_SHAPES_X+30, LFO_SHAPES_Y );
|
||||
m_sawLfoBtn->setActiveGraphic( embed::getIconPixmap(
|
||||
"saw_wave_active" ) );
|
||||
m_sawLfoBtn->setInactiveGraphic( embed::getIconPixmap(
|
||||
@@ -378,7 +381,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
"oscillator." ) );
|
||||
|
||||
m_sqrLfoBtn = new pixmapButton( this );
|
||||
m_sqrLfoBtn->move( lfo_shapes_x+45, lfo_shapes_y );
|
||||
m_sqrLfoBtn->move( LFO_SHAPES_X+45, LFO_SHAPES_Y );
|
||||
m_sqrLfoBtn->setActiveGraphic( embed::getIconPixmap(
|
||||
"square_wave_active" ) );
|
||||
m_sqrLfoBtn->setInactiveGraphic( embed::getIconPixmap(
|
||||
@@ -391,6 +394,21 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
tr( "Click here if you want a square-wave for current "
|
||||
"oscillator." ) );
|
||||
|
||||
m_usrLfoBtn = new pixmapButton( this );
|
||||
m_usrLfoBtn->move( LFO_SHAPES_X+60, LFO_SHAPES_Y );
|
||||
m_usrLfoBtn->setActiveGraphic( embed::getIconPixmap(
|
||||
"usr_wave_active" ) );
|
||||
m_usrLfoBtn->setInactiveGraphic( embed::getIconPixmap(
|
||||
"usr_wave_inactive" ) );
|
||||
#ifdef QT4
|
||||
m_usrLfoBtn->setWhatsThis(
|
||||
#else
|
||||
QWhatsThis::add( m_usrLfoBtn,
|
||||
#endif
|
||||
tr( "Click here if you want a user-defined wave for current "
|
||||
"oscillator. Afterwards drag an according sample-"
|
||||
"file into LFO-graph." ) );
|
||||
|
||||
connect( m_sinLfoBtn, SIGNAL( toggled( bool ) ), this,
|
||||
SLOT( lfoSinWaveCh( bool ) ) );
|
||||
connect( m_triangleLfoBtn, SIGNAL( toggled( bool ) ), this,
|
||||
@@ -399,12 +417,15 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
SLOT( lfoSawWaveCh( bool ) ) );
|
||||
connect( m_sqrLfoBtn, SIGNAL( toggled( bool ) ), this,
|
||||
SLOT( lfoSquareWaveCh( bool ) ) );
|
||||
connect( m_usrLfoBtn, SIGNAL( toggled( bool ) ), this,
|
||||
SLOT( lfoUserWaveCh( bool ) ) );
|
||||
|
||||
QButtonGroup * lfo_shapes_algo_group = new QButtonGroup( this );
|
||||
lfo_shapes_algo_group->addButton( m_sinLfoBtn );
|
||||
lfo_shapes_algo_group->addButton( m_triangleLfoBtn );
|
||||
lfo_shapes_algo_group->addButton( m_sawLfoBtn );
|
||||
lfo_shapes_algo_group->addButton( m_sqrLfoBtn );
|
||||
lfo_shapes_algo_group->addButton( m_usrLfoBtn );
|
||||
lfo_shapes_algo_group->setExclusive( TRUE );
|
||||
#ifndef QT4
|
||||
lfo_shapes_algo_group->hide();
|
||||
@@ -412,7 +433,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
|
||||
m_x100Cb = new ledCheckBox( tr( "FREQ x 100" ), this );
|
||||
m_x100Cb->setFont( pointSize<6>( m_x100Cb->font() ) );
|
||||
m_x100Cb->move( lfo_predelay_knob_x, lfo_graph_y + 36 );
|
||||
m_x100Cb->move( LFO_PREDELAY_KNOB_X, LFO_GRAPH_Y + 36 );
|
||||
#ifdef QT4
|
||||
m_x100Cb->setWhatsThis(
|
||||
#else
|
||||
@@ -427,7 +448,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
|
||||
m_controlEnvAmountCb = new ledCheckBox( tr( "MODULATE ENV-AMOUNT" ),
|
||||
this );
|
||||
m_controlEnvAmountCb->move( lfo_predelay_knob_x, lfo_graph_y + 54 );
|
||||
m_controlEnvAmountCb->move( LFO_PREDELAY_KNOB_X, LFO_GRAPH_Y + 54 );
|
||||
m_controlEnvAmountCb->setFont( pointSize<6>(
|
||||
m_controlEnvAmountCb->font() ) );
|
||||
#ifdef QT4
|
||||
@@ -445,6 +466,7 @@ envelopeAndLFOWidget::envelopeAndLFOWidget( float _value_for_zero_amount,
|
||||
// set background-mode for flicker-free redraw
|
||||
setBackgroundMode( Qt::NoBackground );
|
||||
#endif
|
||||
setAcceptDrops( TRUE );
|
||||
|
||||
connect( mixer::inst(), SIGNAL( sampleRateChanged() ), this,
|
||||
SLOT( updateSampleVars() ) );
|
||||
@@ -585,7 +607,8 @@ void envelopeAndLFOWidget::saveSettings( QDomDocument & ,
|
||||
_parent.setAttribute( "ctlenvamt", QString::number(
|
||||
m_controlEnvAmountCb->isChecked() ) );
|
||||
_parent.setAttribute( "lfosyncmode", QString::number(
|
||||
( int ) m_lfoSpeedKnob->getSyncMode() ) );
|
||||
( int ) m_lfoSpeedKnob->getSyncMode() ) );
|
||||
_parent.setAttribute( "userwavefile", m_userWave.audioFile() );
|
||||
}
|
||||
|
||||
|
||||
@@ -614,39 +637,28 @@ void envelopeAndLFOWidget::loadSettings( const QDomElement & _this )
|
||||
m_lfoSpeedKnob->setSyncMode(
|
||||
( tempoSyncKnob::tempoSyncMode ) _this.attribute(
|
||||
"lfosyncmode" ).toInt() );
|
||||
m_userWave.setAudioFile( _this.attribute( "userwavefile" ) );
|
||||
|
||||
switch( m_lfoShape )
|
||||
{
|
||||
case SIN:
|
||||
#ifdef QT4
|
||||
m_sinLfoBtn->setChecked( TRUE );
|
||||
#else
|
||||
m_sinLfoBtn->setOn( TRUE );
|
||||
#endif
|
||||
break;
|
||||
|
||||
case TRIANGLE:
|
||||
#ifdef QT4
|
||||
m_triangleLfoBtn->setChecked( TRUE );
|
||||
#else
|
||||
m_triangleLfoBtn->setOn( TRUE );
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SAW:
|
||||
#ifdef QT4
|
||||
m_sawLfoBtn->setChecked( TRUE );
|
||||
#else
|
||||
m_sawLfoBtn->setOn( TRUE );
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SQUARE:
|
||||
#ifdef QT4
|
||||
m_sqrLfoBtn->setChecked( TRUE );
|
||||
#else
|
||||
m_sqrLfoBtn->setOn( TRUE );
|
||||
#endif
|
||||
break;
|
||||
|
||||
case USER:
|
||||
m_usrLfoBtn->setChecked( TRUE );
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -659,6 +671,78 @@ void envelopeAndLFOWidget::loadSettings( const QDomElement & _this )
|
||||
|
||||
|
||||
|
||||
void envelopeAndLFOWidget::mousePressEvent( QMouseEvent * _me )
|
||||
{
|
||||
if( _me->button() != Qt::LeftButton )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if( QRect( ENV_GRAPH_X, ENV_GRAPH_Y, s_envGraph->width(),
|
||||
s_envGraph->height() ).contains( _me->pos() ) == TRUE )
|
||||
{
|
||||
if( m_amountKnob->value() < 1.0f )
|
||||
{
|
||||
m_amountKnob->setValue( 1.0f );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_amountKnob->setValue( 0.0f );
|
||||
}
|
||||
updateSampleVars();
|
||||
}
|
||||
else if( QRect( LFO_GRAPH_X, LFO_GRAPH_Y, s_lfoGraph->width(),
|
||||
s_lfoGraph->height() ).contains( _me->pos() ) == TRUE )
|
||||
{
|
||||
if( m_lfoAmountKnob->value() < 1.0f )
|
||||
{
|
||||
m_lfoAmountKnob->setValue( 1.0f );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_lfoAmountKnob->setValue( 0.0f );
|
||||
}
|
||||
updateSampleVars();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void envelopeAndLFOWidget::dragEnterEvent( QDragEnterEvent * _dee )
|
||||
{
|
||||
stringPairDrag::processDragEnterEvent( _dee,
|
||||
QString( "samplefile,tco_%1" ).arg(
|
||||
track::SAMPLE_TRACK ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void envelopeAndLFOWidget::dropEvent( QDropEvent * _de )
|
||||
{
|
||||
QString type = stringPairDrag::decodeKey( _de );
|
||||
QString value = stringPairDrag::decodeValue( _de );
|
||||
if( type == "samplefile" )
|
||||
{
|
||||
m_userWave.setAudioFile( stringPairDrag::decodeValue( _de ) );
|
||||
m_usrLfoBtn->setChecked( TRUE );
|
||||
lfoUserWaveCh( TRUE );
|
||||
_de->accept();
|
||||
}
|
||||
else if( type == QString( "tco_%1" ).arg( track::SAMPLE_TRACK ) )
|
||||
{
|
||||
multimediaProject mmp( value, FALSE );
|
||||
m_userWave.setAudioFile( mmp.content().firstChild().toElement().
|
||||
attribute( "src" ) );
|
||||
m_usrLfoBtn->setChecked( TRUE );
|
||||
lfoUserWaveCh( TRUE );
|
||||
_de->accept();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
{
|
||||
@@ -680,9 +764,9 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
p.setFont( pointSize<6>( p.font() ) );
|
||||
|
||||
// draw envelope-graph
|
||||
p.drawPixmap( env_graph_x, env_graph_y, *s_envGraph );
|
||||
p.drawPixmap( ENV_GRAPH_X, ENV_GRAPH_Y, *s_envGraph );
|
||||
// draw LFO-graph
|
||||
p.drawPixmap( lfo_graph_x, lfo_graph_y, *s_lfoGraph );
|
||||
p.drawPixmap( LFO_GRAPH_X, LFO_GRAPH_Y, *s_lfoGraph );
|
||||
|
||||
|
||||
p.setFont( pointSize<8>( p.font() ) );
|
||||
@@ -697,19 +781,19 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
const QColor end_points_color( 0xFF, 0xBF, 0x22 );
|
||||
const QColor end_points_bg_color( 0, 0, 2 );
|
||||
|
||||
const int y_base = env_graph_y + s_envGraph->height() - 3;
|
||||
const int y_base = ENV_GRAPH_Y + s_envGraph->height() - 3;
|
||||
const int avail_height = s_envGraph->height() - 6;
|
||||
|
||||
int x1 = env_graph_x + 2 + static_cast<int>( m_predelayKnob->value() *
|
||||
time_unit_width );
|
||||
int x1 = ENV_GRAPH_X + 2 + static_cast<int>( m_predelayKnob->value() *
|
||||
TIME_UNIT_WIDTH );
|
||||
int x2 = x1 + static_cast<int>( m_attackKnob->value() *
|
||||
time_unit_width );
|
||||
TIME_UNIT_WIDTH );
|
||||
|
||||
p.drawLine( x1, y_base, x2, y_base - avail_height );
|
||||
p.fillRect( x1 - 1, y_base - 2, 4, 4, end_points_bg_color );
|
||||
p.fillRect( x1, y_base - 1, 2, 2, end_points_color );
|
||||
x1 = x2;
|
||||
x2 = x1 + static_cast<int>( m_holdKnob->value() * time_unit_width );
|
||||
x2 = x1 + static_cast<int>( m_holdKnob->value() * TIME_UNIT_WIDTH );
|
||||
|
||||
p.drawLine( x1, y_base - avail_height, x2, y_base - avail_height );
|
||||
p.fillRect( x1 - 1, y_base - 2 - avail_height, 4, 4,
|
||||
@@ -718,7 +802,7 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
x1 = x2;
|
||||
x2 = x1 + static_cast<int>( ( m_decayKnob->value() *
|
||||
m_sustainKnob->value() ) *
|
||||
time_unit_width );
|
||||
TIME_UNIT_WIDTH );
|
||||
|
||||
p.drawLine( x1, y_base-avail_height, x2, static_cast<int>( y_base -
|
||||
avail_height +
|
||||
@@ -727,7 +811,7 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
end_points_bg_color );
|
||||
p.fillRect( x1, y_base - 1 - avail_height, 2, 2, end_points_color );
|
||||
x1 = x2;
|
||||
x2 = x1 + static_cast<int>( m_releaseKnob->value() * time_unit_width );
|
||||
x2 = x1 + static_cast<int>( m_releaseKnob->value() * TIME_UNIT_WIDTH );
|
||||
|
||||
p.drawLine( x1, static_cast<int>( y_base - avail_height +
|
||||
m_sustainKnob->value() *
|
||||
@@ -744,10 +828,10 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
p.fillRect( x2, y_base - 1, 2, 2, end_points_color );
|
||||
|
||||
|
||||
int lfo_graph_w = s_lfoGraph->width() - 6; // substract border
|
||||
int lfo_graph_h = s_lfoGraph->height() - 6; // substract border
|
||||
int graph_x_base = lfo_graph_x + 3;
|
||||
int graph_y_base = lfo_graph_y + 3 + lfo_graph_h / 2;
|
||||
int LFO_GRAPH_W = s_lfoGraph->width() - 6; // substract border
|
||||
int LFO_GRAPH_H = s_lfoGraph->height() - 6; // substract border
|
||||
int graph_x_base = LFO_GRAPH_X + 3;
|
||||
int graph_y_base = LFO_GRAPH_Y + 3 + LFO_GRAPH_H / 2;
|
||||
|
||||
const float frames_for_graph = SECS_PER_LFO_OSCILLATION *
|
||||
mixer::inst()->sampleRate() / 10;
|
||||
@@ -772,10 +856,10 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
#else
|
||||
int old_y = 0;
|
||||
#endif
|
||||
for( int x = 0; x <= lfo_graph_w; ++x )
|
||||
for( int x = 0; x <= LFO_GRAPH_W; ++x )
|
||||
{
|
||||
float val = 0.0;
|
||||
float cur_sample = x*frames_for_graph/lfo_graph_w;
|
||||
float cur_sample = x * frames_for_graph / LFO_GRAPH_W;
|
||||
if( static_cast<Uint32>( cur_sample ) > m_lfoPredelayFrames )
|
||||
{
|
||||
float phase = ( cur_sample -= m_lfoPredelayFrames ) /
|
||||
@@ -795,6 +879,10 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
case SQUARE:
|
||||
val = oscillator::squareSample( phase );
|
||||
break;
|
||||
case USER:
|
||||
val = oscillator::userWaveSample( phase,
|
||||
m_userWave.data(),
|
||||
m_userWave.frames() );
|
||||
}
|
||||
if( (Uint32) cur_sample <= m_lfoAttackFrames )
|
||||
{
|
||||
@@ -802,12 +890,12 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
}
|
||||
}
|
||||
#ifdef QT4
|
||||
float cur_y = -lfo_graph_h / 2.0f * val;
|
||||
float cur_y = -LFO_GRAPH_H / 2.0f * val;
|
||||
p.drawLine( QLineF( graph_x_base + x - 1, graph_y_base + old_y,
|
||||
graph_x_base + x,
|
||||
graph_y_base + cur_y ) );
|
||||
#else
|
||||
int cur_y = static_cast<int>( -lfo_graph_h / 2.0f * val );
|
||||
int cur_y = static_cast<int>( -LFO_GRAPH_H / 2.0f * val );
|
||||
p.drawLine( graph_x_base + x - 1, graph_y_base + old_y,
|
||||
graph_x_base + x, graph_y_base + cur_y );
|
||||
#endif
|
||||
@@ -818,9 +906,9 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
int ms_per_osc = static_cast<int>( SECS_PER_LFO_OSCILLATION *
|
||||
m_lfoSpeedKnob->value() *
|
||||
1000.0f );
|
||||
p.drawText( lfo_graph_x + 4, lfo_graph_y + s_lfoGraph->height() - 6,
|
||||
p.drawText( LFO_GRAPH_X + 4, LFO_GRAPH_Y + s_lfoGraph->height() - 6,
|
||||
tr( "ms/LFO:" ) );
|
||||
p.drawText( lfo_graph_x + 52, lfo_graph_y + s_lfoGraph->height() - 6,
|
||||
p.drawText( LFO_GRAPH_X + 52, LFO_GRAPH_Y + s_lfoGraph->height() - 6,
|
||||
QString::number( ms_per_osc ) );
|
||||
|
||||
#ifndef QT4
|
||||
@@ -832,44 +920,6 @@ void envelopeAndLFOWidget::paintEvent( QPaintEvent * )
|
||||
|
||||
|
||||
|
||||
void envelopeAndLFOWidget::mousePressEvent( QMouseEvent * _me )
|
||||
{
|
||||
if( _me->button() != Qt::LeftButton )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if( QRect( env_graph_x, env_graph_y, s_envGraph->width(),
|
||||
s_envGraph->height() ).contains( _me->pos() ) == TRUE )
|
||||
{
|
||||
if( m_amountKnob->value() < 1.0f )
|
||||
{
|
||||
m_amountKnob->setValue( 1.0f );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_amountKnob->setValue( 0.0f );
|
||||
}
|
||||
updateSampleVars();
|
||||
}
|
||||
else if( QRect( lfo_graph_x, lfo_graph_y, s_lfoGraph->width(),
|
||||
s_lfoGraph->height() ).contains( _me->pos() ) == TRUE )
|
||||
{
|
||||
if( m_lfoAmountKnob->value() < 1.0f )
|
||||
{
|
||||
m_lfoAmountKnob->setValue( 1.0f );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_lfoAmountKnob->setValue( 0.0f );
|
||||
}
|
||||
updateSampleVars();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void envelopeAndLFOWidget::updateSampleVars( void )
|
||||
{
|
||||
if( !m_busy )
|
||||
@@ -1023,7 +1073,12 @@ void envelopeAndLFOWidget::updateSampleVars( void )
|
||||
m_lfoShapeData[frame] =
|
||||
oscillator::sawSample( phase );
|
||||
break;
|
||||
|
||||
case USER:
|
||||
m_lfoShapeData[frame] =
|
||||
oscillator::userWaveSample( phase,
|
||||
m_userWave.data(),
|
||||
m_userWave.frames() );
|
||||
break;
|
||||
case SIN:
|
||||
default:
|
||||
m_lfoShapeData[frame] =
|
||||
@@ -1113,8 +1168,25 @@ void envelopeAndLFOWidget::lfoSquareWaveCh( bool _on )
|
||||
|
||||
|
||||
|
||||
#undef isChecked
|
||||
#undef setChecked
|
||||
void envelopeAndLFOWidget::lfoUserWaveCh( bool _on )
|
||||
{
|
||||
if( _on )
|
||||
{
|
||||
if( m_userWave.frames() <= 1 )
|
||||
{
|
||||
textFloat::displayMessage( tr( "Hint" ),
|
||||
tr( "Drag a sample from somewhere and drop "
|
||||
"it in this window." ),
|
||||
embed::getIconPixmap( "hint" ), 3000 );
|
||||
}
|
||||
m_lfoShape = USER;
|
||||
}
|
||||
songEditor::inst()->setModified();
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#include "envelope_and_lfo_widget.moc"
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
|
||||
#include <qpushbutton.h>
|
||||
#include <qpopupmenu.h>
|
||||
#include <qheader.h>
|
||||
|
||||
#endif
|
||||
|
||||
@@ -52,6 +53,7 @@
|
||||
#include "gui_templates.h"
|
||||
#include "instrument.h"
|
||||
#include "text_float.h"
|
||||
#include "string_pair_drag.h"
|
||||
|
||||
|
||||
|
||||
@@ -61,65 +63,23 @@ fileBrowser::fileBrowser( const QString & _path, const QString & _filter,
|
||||
sideBarWidget( _title, _pm, _parent ),
|
||||
m_contextMenuItem( NULL ),
|
||||
m_path( _path ),
|
||||
m_filter( _filter ),
|
||||
m_previewPlayHandle( NULL )
|
||||
m_filter( _filter )
|
||||
{
|
||||
setWindowTitle( tr( "Browser" ) );
|
||||
m_l = new Q3ListView( contentParent() );
|
||||
m_l = new listView( contentParent() );
|
||||
addContentWidget( m_l );
|
||||
|
||||
#ifdef QT4
|
||||
connect( m_l, SIGNAL( mouseButtonPressed( int, Q3ListViewItem *,
|
||||
const QPoint &, int ) ),
|
||||
this, SLOT( itemPressed( int, Q3ListViewItem *,
|
||||
const QPoint &, int ) ) );
|
||||
connect( m_l, SIGNAL( mouseButtonClicked( int, Q3ListViewItem *,
|
||||
const QPoint &, int ) ),
|
||||
this, SLOT( itemReleased( int, Q3ListViewItem *,
|
||||
const QPoint &, int ) ) );
|
||||
connect( m_l, SIGNAL( doubleClicked( Q3ListViewItem *,
|
||||
const QPoint &, int ) ),
|
||||
this, SLOT( itemDoubleClicked( Q3ListViewItem *,
|
||||
const QPoint &, int ) ) );
|
||||
|
||||
connect( m_l, SIGNAL( contextMenuRequested( Q3ListViewItem *,
|
||||
const QPoint &, int ) ),
|
||||
this, SLOT( contextMenuRequest( Q3ListViewItem *,
|
||||
const QPoint &, int ) ) );
|
||||
#else
|
||||
connect( m_l, SIGNAL( mouseButtonPressed( int, QListViewItem *,
|
||||
const QPoint &, int ) ),
|
||||
this, SLOT( itemPressed( int, QListViewItem *,
|
||||
const QPoint &, int ) ) );
|
||||
connect( m_l, SIGNAL( mouseButtonClicked( int, QListViewItem *,
|
||||
const QPoint &, int ) ),
|
||||
this, SLOT( itemReleased( int, QListViewItem *,
|
||||
const QPoint &, int ) ) );
|
||||
/* connect( m_l, SIGNAL( pressed( QListViewItem * ) ),
|
||||
this, SLOT( itemClicked( QListViewItem * ) ) );*/
|
||||
connect( m_l, SIGNAL( doubleClicked( QListViewItem *,
|
||||
const QPoint &, int ) ),
|
||||
this, SLOT( itemDoubleClicked( QListViewItem *,
|
||||
const QPoint &, int ) ) );
|
||||
|
||||
connect( m_l, SIGNAL( contextMenuRequested( QListViewItem *,
|
||||
const QPoint &, int ) ),
|
||||
this, SLOT( contextMenuRequest( QListViewItem *,
|
||||
const QPoint &, int ) ) );
|
||||
#endif
|
||||
connect( m_l, SIGNAL( selectionChanged() ), this,
|
||||
SLOT( selectionChanged() ) );
|
||||
|
||||
m_l->addColumn( tr( "Files" ) );
|
||||
m_l->setTreeStepSize( 12 );
|
||||
m_l->setDefaultRenameAction( Q3ListView::Accept );
|
||||
m_l->setSorting( -1 );
|
||||
//setColumnWidthMode (0, Manual);
|
||||
//setColumnWidth (0, 196);
|
||||
m_l->setShowToolTips( TRUE );
|
||||
//m_l->setGeometry (0, 0, 200, 600);
|
||||
|
||||
m_l->setFont( pointSize<8>( m_l->font() ) );
|
||||
|
||||
|
||||
QPushButton * reload_btn = new QPushButton( embed::getIconPixmap(
|
||||
@@ -196,148 +156,6 @@ void fileBrowser::keyPressEvent( QKeyEvent * _ke )
|
||||
|
||||
|
||||
|
||||
#ifdef QT4
|
||||
void fileBrowser::itemPressed( int _btn, Q3ListViewItem * i, const QPoint &, int )
|
||||
#else
|
||||
void fileBrowser::itemPressed( int _btn, QListViewItem * i, const QPoint &, int )
|
||||
#endif
|
||||
{
|
||||
fileItem * f = dynamic_cast<fileItem *>( i );
|
||||
if( f != NULL && _btn == Qt::LeftButton )
|
||||
{
|
||||
if( m_previewPlayHandle != NULL )
|
||||
{
|
||||
mixer::inst()->removePlayHandle( m_previewPlayHandle );
|
||||
m_previewPlayHandle = NULL;
|
||||
}
|
||||
if( f->type() == fileItem::SAMPLE_FILE )
|
||||
{
|
||||
textFloat * tf = textFloat::displayMessage(
|
||||
tr( "Loading sample" ),
|
||||
tr( "Please wait, loading sample for "
|
||||
"preview..." ),
|
||||
embed::getIconPixmap( "sound_file",
|
||||
24, 24 ), 0 );
|
||||
#ifdef QT4
|
||||
qApp->processEvents( QEventLoop::AllEvents );
|
||||
#else
|
||||
qApp->processEvents();
|
||||
#endif
|
||||
samplePlayHandle * s = new samplePlayHandle(
|
||||
f->fullName() );
|
||||
s->setDoneMayReturnTrue( FALSE );
|
||||
m_previewPlayHandle = s;
|
||||
delete tf;
|
||||
}
|
||||
else if( f->type() == fileItem::PRESET_FILE )
|
||||
{
|
||||
m_previewPlayHandle = new presetPreviewPlayHandle(
|
||||
f->fullName() );
|
||||
}
|
||||
if( m_previewPlayHandle != NULL )
|
||||
{
|
||||
mixer::inst()->addPlayHandle( m_previewPlayHandle );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef QT4
|
||||
void fileBrowser::itemReleased( int, Q3ListViewItem * i, const QPoint &, int )
|
||||
#else
|
||||
void fileBrowser::itemReleased( int, QListViewItem * i, const QPoint &, int )
|
||||
#endif
|
||||
{
|
||||
selectionChanged();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void fileBrowser::selectionChanged( void )
|
||||
{
|
||||
if( m_previewPlayHandle != NULL )
|
||||
{
|
||||
// if there're samples shorter than 3 seconds, we don't
|
||||
// stop them if the user releases mouse-button...
|
||||
samplePlayHandle * s = dynamic_cast<samplePlayHandle *>(
|
||||
m_previewPlayHandle );
|
||||
if( s != NULL )
|
||||
{
|
||||
if( s->totalFrames() - s->framesDone() <=
|
||||
static_cast<Uint32>(
|
||||
mixer::inst()->sampleRate() * 3 ) )
|
||||
{
|
||||
s->setDoneMayReturnTrue( TRUE );
|
||||
m_previewPlayHandle = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
mixer::inst()->removePlayHandle( m_previewPlayHandle );
|
||||
m_previewPlayHandle = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef QT4
|
||||
void fileBrowser::itemDoubleClicked( Q3ListViewItem * i, const QPoint &, int )
|
||||
#else
|
||||
void fileBrowser::itemDoubleClicked( QListViewItem * i, const QPoint &, int )
|
||||
#endif
|
||||
{
|
||||
fileItem * f = dynamic_cast<fileItem *>( i );
|
||||
if( f != NULL )
|
||||
{
|
||||
if( f->type() == fileItem::SAMPLE_FILE )
|
||||
{
|
||||
// samples are per default opened in bb-editor because
|
||||
// they're likely drum-samples etc.
|
||||
channelTrack * ct = dynamic_cast<channelTrack *>(
|
||||
track::create(
|
||||
track::CHANNEL_TRACK,
|
||||
bbEditor::inst() ) );
|
||||
#ifdef LMMS_DEBUG
|
||||
assert( ct != NULL );
|
||||
#endif
|
||||
instrument * afp = ct->loadInstrument(
|
||||
"audiofileprocessor" );
|
||||
if( afp != NULL )
|
||||
{
|
||||
afp->setParameter( "audiofile", f->fullName() );
|
||||
}
|
||||
ct->toggledChannelButton( TRUE );
|
||||
}
|
||||
else if( f->type() == fileItem::PRESET_FILE )
|
||||
{
|
||||
// presets are per default opened in bb-editor
|
||||
multimediaProject mmp( f->fullName() );
|
||||
track * t = track::create( track::CHANNEL_TRACK,
|
||||
bbEditor::inst() );
|
||||
channelTrack * ct = dynamic_cast<channelTrack *>( t );
|
||||
if( ct != NULL )
|
||||
{
|
||||
ct->loadTrackSpecificSettings( mmp.content().
|
||||
firstChild().
|
||||
toElement() );
|
||||
ct->toggledChannelButton( TRUE );
|
||||
}
|
||||
}
|
||||
else if( f->type() == fileItem::SONG_FILE )
|
||||
{
|
||||
if( songEditor::inst()->mayChangeProject() == TRUE )
|
||||
{
|
||||
songEditor::inst()->loadProject(
|
||||
f->fullName() );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef QT4
|
||||
void fileBrowser::contextMenuRequest( Q3ListViewItem * i, const QPoint &, int )
|
||||
@@ -359,8 +177,6 @@ void fileBrowser::contextMenuRequest( QListViewItem * i, const QPoint &, int )
|
||||
contextMenu->addAction( tr( "Open in new channel/B+B Editor" ),
|
||||
this,
|
||||
SLOT( openInNewChannelBBE() ) );
|
||||
//contextMenu->addSeparator ();
|
||||
//contextMenu->addAction (tr("Rename"), this, SLOT(renameItem()));
|
||||
contextMenu->exec( QCursor::pos() );
|
||||
m_contextMenuItem = NULL;
|
||||
delete contextMenu;
|
||||
@@ -487,9 +303,222 @@ void fileBrowser::openInNewChannelBBE( void )
|
||||
|
||||
|
||||
|
||||
void fileBrowser::renameItem( void )
|
||||
|
||||
|
||||
|
||||
|
||||
listView::listView( QWidget * _parent ) :
|
||||
Q3ListView( _parent ),
|
||||
m_mousePressed( FALSE ),
|
||||
m_pressPos(),
|
||||
m_previewPlayHandle( NULL )
|
||||
{
|
||||
m_contextMenuItem->startRename( 0 );
|
||||
addColumn( tr( "Files" ) );
|
||||
setTreeStepSize( 12 );
|
||||
setSorting( -1 );
|
||||
setShowToolTips( TRUE );
|
||||
|
||||
setFont( pointSize<8>( font() ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
listView::~listView()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void listView::contentsMouseDoubleClickEvent( QMouseEvent * _me )
|
||||
{
|
||||
Q3ListView::contentsMouseDoubleClickEvent( _me );
|
||||
fileItem * f = dynamic_cast<fileItem *>( itemAt(
|
||||
contentsToViewport( _me->pos() ) ) );
|
||||
if( f != NULL )
|
||||
{
|
||||
if( f->type() == fileItem::SAMPLE_FILE )
|
||||
{
|
||||
// samples are per default opened in bb-editor because
|
||||
// they're likely drum-samples etc.
|
||||
channelTrack * ct = dynamic_cast<channelTrack *>(
|
||||
track::create(
|
||||
track::CHANNEL_TRACK,
|
||||
bbEditor::inst() ) );
|
||||
#ifdef LMMS_DEBUG
|
||||
assert( ct != NULL );
|
||||
#endif
|
||||
instrument * afp = ct->loadInstrument(
|
||||
"audiofileprocessor" );
|
||||
if( afp != NULL )
|
||||
{
|
||||
afp->setParameter( "audiofile", f->fullName() );
|
||||
}
|
||||
ct->toggledChannelButton( TRUE );
|
||||
}
|
||||
else if( f->type() == fileItem::PRESET_FILE )
|
||||
{
|
||||
// presets are per default opened in bb-editor
|
||||
multimediaProject mmp( f->fullName() );
|
||||
track * t = track::create( track::CHANNEL_TRACK,
|
||||
bbEditor::inst() );
|
||||
channelTrack * ct = dynamic_cast<channelTrack *>( t );
|
||||
if( ct != NULL )
|
||||
{
|
||||
ct->loadTrackSpecificSettings( mmp.content().
|
||||
firstChild().
|
||||
toElement() );
|
||||
ct->toggledChannelButton( TRUE );
|
||||
}
|
||||
}
|
||||
else if( f->type() == fileItem::PROJECT_FILE )
|
||||
{
|
||||
if( songEditor::inst()->mayChangeProject() == TRUE )
|
||||
{
|
||||
songEditor::inst()->loadProject(
|
||||
f->fullName() );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void listView::contentsMousePressEvent( QMouseEvent * _me )
|
||||
{
|
||||
Q3ListView::contentsMousePressEvent( _me );
|
||||
if( _me->button() != Qt::LeftButton )
|
||||
{
|
||||
return;
|
||||
}
|
||||
QPoint p( contentsToViewport( _me->pos() ) );
|
||||
Q3ListViewItem * i = itemAt( p );
|
||||
if ( i )
|
||||
{
|
||||
if ( p.x() > header()->cellPos( header()->mapToActual( 0 ) ) +
|
||||
treeStepSize() * ( i->depth() + ( rootIsDecorated() ?
|
||||
1 : 0 ) ) + itemMargin() ||
|
||||
p.x() < header()->cellPos(
|
||||
header()->mapToActual( 0 ) ) )
|
||||
{
|
||||
m_pressPos = _me->pos();
|
||||
m_mousePressed = TRUE;
|
||||
}
|
||||
}
|
||||
fileItem * f = dynamic_cast<fileItem *>( i );
|
||||
if( f != NULL )
|
||||
{
|
||||
if( m_previewPlayHandle != NULL )
|
||||
{
|
||||
mixer::inst()->removePlayHandle( m_previewPlayHandle );
|
||||
m_previewPlayHandle = NULL;
|
||||
}
|
||||
if( f->type() == fileItem::SAMPLE_FILE )
|
||||
{
|
||||
textFloat * tf = textFloat::displayMessage(
|
||||
tr( "Loading sample" ),
|
||||
tr( "Please wait, loading sample for "
|
||||
"preview..." ),
|
||||
embed::getIconPixmap( "sound_file",
|
||||
24, 24 ), 0 );
|
||||
#ifdef QT4
|
||||
qApp->processEvents( QEventLoop::AllEvents );
|
||||
#else
|
||||
qApp->processEvents();
|
||||
#endif
|
||||
samplePlayHandle * s = new samplePlayHandle(
|
||||
f->fullName() );
|
||||
s->setDoneMayReturnTrue( FALSE );
|
||||
m_previewPlayHandle = s;
|
||||
delete tf;
|
||||
}
|
||||
else if( f->type() == fileItem::PRESET_FILE )
|
||||
{
|
||||
m_previewPlayHandle = new presetPreviewPlayHandle(
|
||||
f->fullName() );
|
||||
}
|
||||
if( m_previewPlayHandle != NULL )
|
||||
{
|
||||
mixer::inst()->addPlayHandle( m_previewPlayHandle );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void listView::contentsMouseMoveEvent( QMouseEvent * _me )
|
||||
{
|
||||
if( m_mousePressed == TRUE &&
|
||||
( m_pressPos - _me->pos() ).manhattanLength() >
|
||||
QApplication::startDragDistance() )
|
||||
{
|
||||
contentsMouseReleaseEvent( NULL );
|
||||
fileItem * f = dynamic_cast<fileItem *>( itemAt(
|
||||
contentsToViewport( m_pressPos ) ) );
|
||||
if( f != NULL )
|
||||
{
|
||||
switch( f->type() )
|
||||
{
|
||||
case fileItem::PRESET_FILE:
|
||||
new stringPairDrag( "presetfile",
|
||||
f->fullName(),
|
||||
embed::getIconPixmap(
|
||||
"preset_file" ),
|
||||
this );
|
||||
break;
|
||||
|
||||
case fileItem::SAMPLE_FILE:
|
||||
new stringPairDrag( "samplefile",
|
||||
f->fullName(),
|
||||
embed::getIconPixmap(
|
||||
"sound_file" ),
|
||||
this );
|
||||
break;
|
||||
|
||||
case fileItem::MIDI_FILE:
|
||||
new stringPairDrag( "midifile",
|
||||
f->fullName(),
|
||||
embed::getIconPixmap(
|
||||
"midi_file" ),
|
||||
this );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void listView::contentsMouseReleaseEvent( QMouseEvent * _me )
|
||||
{
|
||||
m_mousePressed = FALSE;
|
||||
if( m_previewPlayHandle != NULL )
|
||||
{
|
||||
// if there're samples shorter than 3 seconds, we don't
|
||||
// stop them if the user releases mouse-button...
|
||||
samplePlayHandle * s = dynamic_cast<samplePlayHandle *>(
|
||||
m_previewPlayHandle );
|
||||
if( s != NULL )
|
||||
{
|
||||
if( s->totalFrames() - s->framesDone() <=
|
||||
static_cast<Uint32>(
|
||||
mixer::inst()->sampleRate() * 3 ) )
|
||||
{
|
||||
s->setDoneMayReturnTrue( TRUE );
|
||||
m_previewPlayHandle = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
mixer::inst()->removePlayHandle( m_previewPlayHandle );
|
||||
m_previewPlayHandle = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -658,9 +687,10 @@ void directory::setup( void )
|
||||
|
||||
|
||||
|
||||
QPixmap * fileItem::s_songFilePixmap = NULL;
|
||||
QPixmap * fileItem::s_projectFilePixmap = NULL;
|
||||
QPixmap * fileItem::s_presetFilePixmap = NULL;
|
||||
QPixmap * fileItem::s_sampleFilePixmap = NULL;
|
||||
QPixmap * fileItem::s_midiFilePixmap = NULL;
|
||||
QPixmap * fileItem::s_unknownFilePixmap = NULL;
|
||||
|
||||
|
||||
@@ -692,33 +722,46 @@ fileItem::fileItem( Q3ListViewItem * _parent, const QString & _name,
|
||||
|
||||
void fileItem::initPixmapStuff( void )
|
||||
{
|
||||
if( s_songFilePixmap == NULL )
|
||||
if( s_projectFilePixmap == NULL )
|
||||
{
|
||||
s_songFilePixmap = new QPixmap( embed::getIconPixmap(
|
||||
s_projectFilePixmap = new QPixmap( embed::getIconPixmap(
|
||||
"project_file", 16, 16 ) );
|
||||
}
|
||||
|
||||
if( s_presetFilePixmap == NULL )
|
||||
{
|
||||
s_presetFilePixmap = new QPixmap( embed::getIconPixmap(
|
||||
"preset_file", 16, 16 ) );
|
||||
}
|
||||
|
||||
if( s_sampleFilePixmap == NULL )
|
||||
{
|
||||
s_sampleFilePixmap = new QPixmap( embed::getIconPixmap(
|
||||
"sound_file", 16, 16 ) );
|
||||
}
|
||||
|
||||
if( s_midiFilePixmap == NULL )
|
||||
{
|
||||
s_midiFilePixmap = new QPixmap( embed::getIconPixmap(
|
||||
"midi_file", 16, 16 ) );
|
||||
}
|
||||
|
||||
if( s_unknownFilePixmap == NULL )
|
||||
{
|
||||
s_unknownFilePixmap = new QPixmap( embed::getIconPixmap(
|
||||
"unknown_file" ) );
|
||||
"unknown_file" ) );
|
||||
}
|
||||
|
||||
switch( m_type )
|
||||
{
|
||||
case SONG_FILE: m_pix = s_songFilePixmap; break;
|
||||
case PROJECT_FILE: m_pix = s_projectFilePixmap; break;
|
||||
case PRESET_FILE: m_pix = s_presetFilePixmap; break;
|
||||
case SAMPLE_FILE: m_pix = s_sampleFilePixmap; break;
|
||||
case UNKNOWN: m_pix = s_unknownFilePixmap; break;
|
||||
case MIDI_FILE: m_pix = s_midiFilePixmap; break;
|
||||
case UNKNOWN:
|
||||
default:
|
||||
m_pix = s_unknownFilePixmap;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -734,7 +777,7 @@ void fileItem::determineFileType( void )
|
||||
#endif
|
||||
if( ext == "mmp" || ext == "mpt" )
|
||||
{
|
||||
m_type = SONG_FILE;
|
||||
m_type = PROJECT_FILE;
|
||||
}
|
||||
else if( ext == "xml" )
|
||||
{
|
||||
@@ -742,7 +785,7 @@ void fileItem::determineFileType( void )
|
||||
multimediaProject::typeOfFile( fullName() );
|
||||
if( t == multimediaProject::SONG_PROJECT )
|
||||
{
|
||||
m_type = SONG_FILE;
|
||||
m_type = PROJECT_FILE;
|
||||
}
|
||||
else if( t == multimediaProject::CHANNEL_SETTINGS )
|
||||
{
|
||||
@@ -763,6 +806,10 @@ void fileItem::determineFileType( void )
|
||||
{
|
||||
m_type = SAMPLE_FILE;
|
||||
}
|
||||
else if( ext == "mid" )
|
||||
{
|
||||
m_type = MIDI_FILE;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_type = UNKNOWN;
|
||||
|
||||
@@ -504,7 +504,7 @@ audioDevice * mixer::tryAudioDevices( void )
|
||||
midiClient * mixer::tryMIDIClients( void )
|
||||
{
|
||||
QString client_name = configManager::inst()->value( "mixer",
|
||||
"midiclient" );
|
||||
"mididev" );
|
||||
|
||||
#ifdef ALSA_SUPPORT
|
||||
if( client_name == midiALSASeq::name() || client_name == "" )
|
||||
|
||||
@@ -140,7 +140,7 @@ void nameLabel::mousePressEvent( QMouseEvent * _me )
|
||||
else
|
||||
{
|
||||
emit clicked();
|
||||
//QLabel::mousePressEvent( _me );
|
||||
QLabel::mousePressEvent( _me );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -199,7 +199,7 @@ void notePlayHandle::play( void )
|
||||
void notePlayHandle::checkValidity( void )
|
||||
{
|
||||
if( m_channelTrack != NULL &&
|
||||
m_channelTrack->trackType() == track::NULL_TRACK )
|
||||
m_channelTrack->type() == track::NULL_TRACK )
|
||||
{
|
||||
m_channelTrack = NULL;
|
||||
}
|
||||
|
||||
@@ -140,8 +140,6 @@ pianoRoll::pianoRoll( void ) :
|
||||
m_notesEditHeight( 100 ),
|
||||
m_ppt( DEFAULT_PR_PPT ),
|
||||
m_lenOfNewNotes( midiTime( 0, 16 ) ),
|
||||
m_shiftPressed( FALSE ),
|
||||
m_controlPressed( FALSE ),
|
||||
m_startKey( INITIAL_START_KEY ),
|
||||
m_keyMouseOver( INITIAL_START_KEY ),
|
||||
m_lastKey( 0 ),
|
||||
@@ -1781,23 +1779,6 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me )
|
||||
|
||||
void pianoRoll::keyPressEvent( QKeyEvent * _ke )
|
||||
{
|
||||
if( _ke->key() == Qt::Key_Shift )
|
||||
{
|
||||
m_shiftPressed = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_shiftPressed = FALSE;
|
||||
}
|
||||
if( _ke->key() == Qt::Key_Control )
|
||||
{
|
||||
m_controlPressed = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_controlPressed = FALSE;
|
||||
}
|
||||
|
||||
switch( _ke->key() )
|
||||
{
|
||||
case Qt::Key_Up:
|
||||
@@ -1919,19 +1900,10 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke )
|
||||
|
||||
|
||||
|
||||
void pianoRoll::keyReleaseEvent( QKeyEvent * )
|
||||
{
|
||||
m_shiftPressed = FALSE;
|
||||
m_controlPressed = FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void pianoRoll::wheelEvent( QWheelEvent * _we )
|
||||
{
|
||||
_we->accept();
|
||||
if( m_controlPressed )
|
||||
if( lmmsMainWin::isCtrlPressed() == TRUE )
|
||||
{
|
||||
if( _we->delta() > 0 )
|
||||
{
|
||||
@@ -1958,7 +1930,7 @@ void pianoRoll::wheelEvent( QWheelEvent * _we )
|
||||
m_timeLine->setPixelsPerTact( m_ppt );
|
||||
update();
|
||||
}
|
||||
else if( m_shiftPressed )
|
||||
else if( lmmsMainWin::isShiftPressed() )
|
||||
{
|
||||
m_leftRightScroll->setValue( m_leftRightScroll->value() -
|
||||
_we->delta() * 2 / 15 );
|
||||
|
||||
@@ -23,25 +23,19 @@
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_DLFCN_H
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#include "qt3support.h"
|
||||
|
||||
#ifdef QT4
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QDir>
|
||||
#include <QLibrary>
|
||||
|
||||
#else
|
||||
|
||||
#include <qmessagebox.h>
|
||||
#include <qdir.h>
|
||||
#include <qlibrary.h>
|
||||
|
||||
#endif
|
||||
|
||||
@@ -87,15 +81,16 @@ QString plugin::getParameter( const QString & )
|
||||
|
||||
plugin * plugin::instantiate( const QString & _plugin_name, void * _data )
|
||||
{
|
||||
#ifdef HAVE_DLFCN_H
|
||||
/*#ifdef HAVE_DLFCN_H
|
||||
void * handle = dlopen( QString( "lib" + _plugin_name + ".so" ).
|
||||
#ifdef QT4
|
||||
toAscii().constData()
|
||||
#else
|
||||
ascii()
|
||||
#endif
|
||||
, RTLD_NOW );
|
||||
if( handle == NULL )
|
||||
, RTLD_NOW );*/
|
||||
QLibrary plugin_lib( _plugin_name );
|
||||
if( /*handle == NULL*/ plugin_lib.load() == FALSE )
|
||||
{
|
||||
QMessageBox::information( NULL,
|
||||
mixer::tr( "Plugin not found" ),
|
||||
@@ -105,13 +100,17 @@ plugin * plugin::instantiate( const QString & _plugin_name, void * _data )
|
||||
QMessageBox::Default );
|
||||
return( new dummyPlugin() );
|
||||
}
|
||||
dlerror();
|
||||
instantiationHook inst_hook = ( instantiationHook ) plugin_lib.resolve(
|
||||
"lmms_plugin_main" );
|
||||
/* dlerror();
|
||||
instantiationHook inst_hook = ( instantiationHook )( dlsym( handle,
|
||||
"lmms_plugin_main" ) );
|
||||
char * error = dlerror();
|
||||
if( error != NULL )
|
||||
{
|
||||
printf( "%s\n", error );
|
||||
printf( "%s\n", error );*/
|
||||
if( inst_hook == NULL )
|
||||
{
|
||||
QMessageBox::information( NULL,
|
||||
mixer::tr( "Error while loading plugin" ),
|
||||
mixer::tr( "Failed loading plugin \"%1\"!"
|
||||
@@ -120,11 +119,14 @@ plugin * plugin::instantiate( const QString & _plugin_name, void * _data )
|
||||
QMessageBox::Default );
|
||||
return( new dummyPlugin() );
|
||||
}
|
||||
#ifndef QT4
|
||||
plugin_lib.setAutoUnload( FALSE );
|
||||
#endif
|
||||
plugin * inst = inst_hook( _data );
|
||||
//dlclose( handle );
|
||||
return( inst );
|
||||
#endif
|
||||
return( new dummyPlugin() );
|
||||
/*#endif
|
||||
return( new dummyPlugin() );*/
|
||||
}
|
||||
|
||||
|
||||
@@ -134,8 +136,8 @@ void plugin::getDescriptorsOfAvailPlugins( vvector<descriptor> & _plugin_descs )
|
||||
{
|
||||
QDir directory( configManager::inst()->pluginDir() );
|
||||
#ifdef QT4
|
||||
QFileInfoList list = directory.entryInfoList( QStringList(
|
||||
"lib*.so" ) );
|
||||
QFileInfoList list = directory.entryInfoList(
|
||||
QStringList( "lib*.so" ) );
|
||||
#else
|
||||
const QFileInfoList * lp = directory.entryInfoList( "lib*.so" );
|
||||
// if directory doesn't exist or isn't readable, we get NULL which would
|
||||
@@ -154,6 +156,16 @@ void plugin::getDescriptorsOfAvailPlugins( vvector<descriptor> & _plugin_descs )
|
||||
#else
|
||||
const QFileInfo & f = **file;
|
||||
#endif
|
||||
QLibrary plugin_lib( f.absoluteFilePath() );
|
||||
if( plugin_lib.load() == FALSE ||
|
||||
plugin_lib.resolve( "lmms_plugin_main" ) == NULL )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
#ifndef QT4
|
||||
plugin_lib.setAutoUnload( FALSE );
|
||||
#endif
|
||||
/*
|
||||
void * handle = dlopen( f.absoluteFilePath().
|
||||
#ifdef QT4
|
||||
toAscii().constData(),
|
||||
@@ -173,11 +185,26 @@ void plugin::getDescriptorsOfAvailPlugins( vvector<descriptor> & _plugin_descs )
|
||||
{
|
||||
printf( "plugin-loader: %s\n", msg );
|
||||
continue;
|
||||
}
|
||||
QString desc_name = f.fileName().mid( 3 ).section( '.', 0, 0 ) +
|
||||
}*/
|
||||
QString desc_name = f.fileName().section( '.', 0, 0 ) +
|
||||
"_plugin_descriptor";
|
||||
descriptor * plugin_desc =
|
||||
(descriptor *) dlsym( handle, desc_name.
|
||||
if( desc_name.left( 3 ) == "lib" )
|
||||
{
|
||||
desc_name = desc_name.mid( 3 );
|
||||
}
|
||||
descriptor * plugin_desc = (descriptor *) plugin_lib.resolve(
|
||||
desc_name.
|
||||
#ifdef QT4
|
||||
toAscii().constData()
|
||||
#else
|
||||
ascii()
|
||||
#endif
|
||||
);
|
||||
if( plugin_desc == NULL )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
/* (descriptor *) dlsym( handle, desc_name.
|
||||
#ifdef QT4
|
||||
toAscii().constData()
|
||||
#else
|
||||
@@ -189,7 +216,7 @@ void plugin::getDescriptorsOfAvailPlugins( vvector<descriptor> & _plugin_descs )
|
||||
{
|
||||
printf( "plugin-loader: %s\n", msg );
|
||||
continue;
|
||||
}
|
||||
}*/
|
||||
_plugin_descs.push_back( *plugin_desc );
|
||||
//dlclose( handle );
|
||||
}
|
||||
|
||||
@@ -233,8 +233,8 @@ void pluginDescWidget::mousePressEvent( QMouseEvent * _me )
|
||||
{
|
||||
if( _me->button() == Qt::LeftButton )
|
||||
{
|
||||
new stringPairDrag( "plugin", m_pluginDescriptor.name, m_logo,
|
||||
this );
|
||||
new stringPairDrag( "instrument", m_pluginDescriptor.name,
|
||||
m_logo, this );
|
||||
m_mouseOver = FALSE;
|
||||
update();
|
||||
}
|
||||
|
||||
@@ -109,13 +109,12 @@ songEditor::songEditor() :
|
||||
m_exporting( FALSE ),
|
||||
m_playing( FALSE ),
|
||||
m_paused( FALSE ),
|
||||
m_loadingProject( FALSE ),
|
||||
m_playMode( PLAY_SONG ),
|
||||
m_trackToPlay( NULL ),
|
||||
m_patternToPlay( NULL ),
|
||||
m_loopPattern( FALSE ),
|
||||
m_scrollBack( FALSE ),
|
||||
m_shiftPressed( FALSE ),
|
||||
m_controlPressed( FALSE )
|
||||
m_scrollBack( FALSE )
|
||||
{
|
||||
// hack, because code called out of this function uses
|
||||
// songEditor::inst(), which assigns s_instanceOfMe this function
|
||||
@@ -211,7 +210,7 @@ songEditor::songEditor() :
|
||||
#endif
|
||||
m_masterVolumeSlider->setFixedSize( 26, 60 );
|
||||
m_masterVolumeSlider->setTickInterval( 50 );
|
||||
toolTip::add( m_masterVolumeSlider, tr( "master output volume" ) );
|
||||
toolTip::add( m_masterVolumeSlider, tr( "master volume" ) );
|
||||
|
||||
connect( m_masterVolumeSlider, SIGNAL( valueChanged( int ) ), this,
|
||||
SLOT( masterVolumeChanged( int ) ) );
|
||||
@@ -223,6 +222,8 @@ songEditor::songEditor() :
|
||||
SLOT( masterVolumeReleased() ) );
|
||||
|
||||
m_mvsStatus = new textFloat( m_masterVolumeSlider );
|
||||
m_mvsStatus->setTitle( tr( "Master volume" ) );
|
||||
m_mvsStatus->setPixmap( embed::getIconPixmap( "master_volume" ) );
|
||||
|
||||
lmmsMainWin::inst()->addWidgetToToolBar( master_vol_lbl );
|
||||
lmmsMainWin::inst()->addWidgetToToolBar( m_masterVolumeSlider );
|
||||
@@ -256,6 +257,8 @@ songEditor::songEditor() :
|
||||
SLOT( masterPitchReleased() ) );
|
||||
|
||||
m_mpsStatus = new textFloat( m_masterPitchSlider );
|
||||
m_mpsStatus->setTitle( tr( "Master pitch" ) );
|
||||
m_mpsStatus->setPixmap( embed::getIconPixmap( "master_pitch" ) );
|
||||
|
||||
lmmsMainWin::inst()->addWidgetToToolBar( master_pitch_lbl );
|
||||
lmmsMainWin::inst()->addWidgetToToolBar( m_masterPitchSlider );
|
||||
@@ -493,30 +496,15 @@ void songEditor::resizeEvent( QResizeEvent * _re )
|
||||
|
||||
void songEditor::keyPressEvent( QKeyEvent * _ke )
|
||||
{
|
||||
if( _ke->key() == Qt::Key_Shift )
|
||||
{
|
||||
m_shiftPressed = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_shiftPressed = FALSE;
|
||||
}
|
||||
if( _ke->key() == Qt::Key_Control )
|
||||
{
|
||||
m_controlPressed = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_controlPressed = FALSE;
|
||||
}
|
||||
|
||||
if( _ke->modifiers() & Qt::ShiftModifier &&
|
||||
_ke->key() == Qt::Key_Insert )
|
||||
if( /*_ke->modifiers() & Qt::ShiftModifier*/
|
||||
lmmsMainWin::isShiftPressed() == TRUE &&
|
||||
_ke->key() == Qt::Key_Insert )
|
||||
{
|
||||
insertBar();
|
||||
}
|
||||
else if( _ke->modifiers() & Qt::ShiftModifier &&
|
||||
_ke->key() == Qt::Key_Delete )
|
||||
else if(/* _ke->modifiers() & Qt::ShiftModifier &&*/
|
||||
lmmsMainWin::isShiftPressed() == TRUE &&
|
||||
_ke->key() == Qt::Key_Delete )
|
||||
{
|
||||
removeBar();
|
||||
}
|
||||
@@ -557,7 +545,7 @@ void songEditor::keyPressEvent( QKeyEvent * _ke )
|
||||
}
|
||||
else
|
||||
{
|
||||
_ke->ignore();
|
||||
QWidget::keyPressEvent( _ke );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -576,7 +564,7 @@ void songEditor::scrolled( int _new_pos )
|
||||
|
||||
void songEditor::wheelEvent( QWheelEvent * _we )
|
||||
{
|
||||
if( m_controlPressed )
|
||||
if( lmmsMainWin::isCtrlPressed() == TRUE )
|
||||
{
|
||||
if( _we->delta() > 0 )
|
||||
{
|
||||
@@ -592,12 +580,12 @@ void songEditor::wheelEvent( QWheelEvent * _we )
|
||||
m_zoomingComboBox->setCurrentIndex(
|
||||
m_zoomingComboBox->findText( QString::number(
|
||||
static_cast<int>( pixelsPerTact() *
|
||||
100 / DEFAULT_PIXELS_PER_TACT ) ) +"%" ) );
|
||||
100 / DEFAULT_PIXELS_PER_TACT ) ) + "%" ) );
|
||||
#else
|
||||
// update combobox with zooming-factor
|
||||
m_zoomingComboBox->setCurrentText( QString::number(
|
||||
static_cast<int>( pixelsPerTact() *
|
||||
100 / DEFAULT_PIXELS_PER_TACT ) ) +"%" );
|
||||
100 / DEFAULT_PIXELS_PER_TACT ) ) + "%" );
|
||||
#endif
|
||||
// update timeline
|
||||
m_playPos[PLAY_SONG].m_timeLine->setPixelsPerTact(
|
||||
@@ -605,7 +593,7 @@ void songEditor::wheelEvent( QWheelEvent * _we )
|
||||
// and make sure, all TCO's are resized and relocated
|
||||
realignTracks( TRUE );
|
||||
}
|
||||
else if( m_shiftPressed )
|
||||
else if( lmmsMainWin::isShiftPressed() == TRUE )
|
||||
{
|
||||
m_leftRightScroll->setValue( m_leftRightScroll->value() -
|
||||
_we->delta() / 30 );
|
||||
@@ -623,10 +611,14 @@ void songEditor::wheelEvent( QWheelEvent * _we )
|
||||
|
||||
void songEditor::masterVolumeChanged( int _new_val )
|
||||
{
|
||||
if( m_mvsStatus->isVisible() == FALSE )
|
||||
masterVolumeMoved( _new_val );
|
||||
if( m_mvsStatus->isVisible() == FALSE && m_loadingProject == FALSE )
|
||||
{
|
||||
masterVolumeMoved( _new_val );
|
||||
m_mvsStatus->reparent( m_masterVolumeSlider );
|
||||
m_mvsStatus->move( m_masterVolumeSlider->mapTo(
|
||||
m_masterVolumeSlider->topLevelWidget(),
|
||||
QPoint( 0, 0 ) ) +
|
||||
QPoint( m_masterVolumeSlider->width() + 2, -2 ) );
|
||||
m_mvsStatus->setVisibilityTimeOut( 1000 );
|
||||
}
|
||||
mixer::inst()->setMasterGain( 2.0f - _new_val / 100.0f );
|
||||
@@ -639,6 +631,10 @@ void songEditor::masterVolumeChanged( int _new_val )
|
||||
void songEditor::masterVolumePressed( void )
|
||||
{
|
||||
m_mvsStatus->reparent( m_masterVolumeSlider );
|
||||
m_mvsStatus->move( m_masterVolumeSlider->mapTo(
|
||||
m_masterVolumeSlider->topLevelWidget(),
|
||||
QPoint( 0, 0 ) ) +
|
||||
QPoint( m_masterVolumeSlider->width() + 2, -2 ) );
|
||||
m_mvsStatus->show();
|
||||
masterVolumeMoved( m_masterVolumeSlider->value() );
|
||||
}
|
||||
@@ -648,8 +644,7 @@ void songEditor::masterVolumePressed( void )
|
||||
|
||||
void songEditor::masterVolumeMoved( int _new_val )
|
||||
{
|
||||
m_mvsStatus->setText( tr( "Master output volume: %1%" ).arg( 200 -
|
||||
_new_val ) );
|
||||
m_mvsStatus->setText( tr( "Value: %1%" ).arg( 200 - _new_val ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -665,10 +660,14 @@ void songEditor::masterVolumeReleased( void )
|
||||
|
||||
void songEditor::masterPitchChanged( int _new_val )
|
||||
{
|
||||
if( m_mpsStatus->isVisible() == FALSE )
|
||||
masterPitchMoved( _new_val );
|
||||
if( m_mpsStatus->isVisible() == FALSE && m_loadingProject == FALSE )
|
||||
{
|
||||
masterPitchMoved( _new_val );
|
||||
m_mpsStatus->reparent( m_masterPitchSlider );
|
||||
m_mpsStatus->move( m_masterPitchSlider->mapTo(
|
||||
m_masterPitchSlider->topLevelWidget(),
|
||||
QPoint( 0, 0 ) ) +
|
||||
QPoint( m_masterPitchSlider->width() + 2, -2 ) );
|
||||
m_mpsStatus->setVisibilityTimeOut( 1000 );
|
||||
}
|
||||
setModified();
|
||||
@@ -680,6 +679,10 @@ void songEditor::masterPitchChanged( int _new_val )
|
||||
void songEditor::masterPitchPressed( void )
|
||||
{
|
||||
m_mpsStatus->reparent( m_masterPitchSlider );
|
||||
m_mpsStatus->move( m_masterPitchSlider->mapTo(
|
||||
m_masterPitchSlider->topLevelWidget(),
|
||||
QPoint( 0, 0 ) ) +
|
||||
QPoint( m_masterPitchSlider->width() + 2, -2 ) );
|
||||
m_mpsStatus->show();
|
||||
masterPitchMoved( m_masterPitchSlider->value() );
|
||||
}
|
||||
@@ -689,8 +692,7 @@ void songEditor::masterPitchPressed( void )
|
||||
|
||||
void songEditor::masterPitchMoved( int _new_val )
|
||||
{
|
||||
m_mpsStatus->setText( tr( "Master pitch: %1 semitones").arg(
|
||||
-_new_val ) );
|
||||
m_mpsStatus->setText( tr( "Value: %1 semitones").arg( -_new_val ) );
|
||||
|
||||
}
|
||||
|
||||
@@ -957,7 +959,7 @@ void songEditor::processNextBuffer( void )
|
||||
while( total_frames_played < mixer::inst()->framesPerAudioBuffer() )
|
||||
{
|
||||
Uint32 played_frames = mixer::inst()->framesPerAudioBuffer() -
|
||||
total_frames_played;
|
||||
total_frames_played;
|
||||
|
||||
// did we play a whole tact?
|
||||
if( m_playPos[m_playMode].currentFrame() >= frames_per_tact )
|
||||
@@ -1019,9 +1021,8 @@ void songEditor::processNextBuffer( void )
|
||||
|
||||
// update frame-counters
|
||||
total_frames_played += played_frames;
|
||||
m_playPos[m_playMode].setCurrentFrame(
|
||||
m_playPos[m_playMode].currentFrame() +
|
||||
played_frames );
|
||||
m_playPos[m_playMode].setCurrentFrame( played_frames +
|
||||
m_playPos[m_playMode].currentFrame() );
|
||||
m_playPos[m_playMode].setTact64th(
|
||||
( m_playPos[m_playMode].currentFrame() *
|
||||
64 / frames_per_tact) % 64 );
|
||||
@@ -1350,7 +1351,11 @@ void songEditor::clearProject( void )
|
||||
//mixer::inst()->clear();
|
||||
while( mixer::inst()->haveNoRunningNotes() == FALSE )
|
||||
{
|
||||
/* qApp->processEvents();*/
|
||||
#ifdef QT4
|
||||
QApplication::processEvents( QEventLoop::AllEvents );
|
||||
#else
|
||||
qApp->processEvents();
|
||||
#endif
|
||||
}
|
||||
|
||||
trackVector tv = tracks();
|
||||
@@ -1385,9 +1390,11 @@ void songEditor::createNewProject( void )
|
||||
"tripleoscillator" );
|
||||
track::create( track::BB_TRACK, this );
|
||||
|
||||
m_loadingProject = TRUE;
|
||||
setBPM( DEFAULT_BPM );
|
||||
m_masterVolumeSlider->setValue( 100 );
|
||||
m_masterPitchSlider->setValue( 0 );
|
||||
m_loadingProject = FALSE;
|
||||
|
||||
m_fileName = m_oldFileName = "";
|
||||
|
||||
@@ -1419,6 +1426,8 @@ void FASTCALL songEditor::loadProject( const QString & _file_name )
|
||||
m_fileName = _file_name;
|
||||
m_oldFileName = _file_name;
|
||||
|
||||
m_loadingProject = TRUE;
|
||||
|
||||
multimediaProject mmp( m_fileName );
|
||||
// if file could not be opened, head-node is null and we create
|
||||
// new project
|
||||
@@ -1451,7 +1460,7 @@ void FASTCALL songEditor::loadProject( const QString & _file_name )
|
||||
else
|
||||
{
|
||||
m_masterVolumeSlider->setValue(
|
||||
DEFAULT_VOLUME );
|
||||
DEFAULT_VOLUME );
|
||||
}
|
||||
}
|
||||
else if( node.nodeName() == "masterpitch" )
|
||||
@@ -1485,6 +1494,8 @@ void FASTCALL songEditor::loadProject( const QString & _file_name )
|
||||
m_modified = FALSE;
|
||||
m_leftRightScroll->setValue( 0 );
|
||||
|
||||
m_loadingProject = FALSE;
|
||||
|
||||
lmmsMainWin::inst()->resetWindowTitle( "" );
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* playpos_marker.cpp - class timeLine, representing a time-line with
|
||||
* position marker
|
||||
* timeline.cpp - class timeLine, representing a time-line with position marker
|
||||
*
|
||||
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
*
|
||||
@@ -48,6 +47,8 @@
|
||||
#include "embed.h"
|
||||
#include "templates.h"
|
||||
#include "nstate_button.h"
|
||||
#include "lmms_main_win.h"
|
||||
#include "text_float.h"
|
||||
|
||||
|
||||
|
||||
@@ -71,6 +72,7 @@ timeLine::timeLine( const int _xoff, const int _yoff, const float _ppt,
|
||||
m_pos( _pos ),
|
||||
m_begin( _begin ),
|
||||
m_savedPos( -1 ),
|
||||
m_hint( NULL ),
|
||||
m_action( NONE ),
|
||||
m_moveXOff( 0 )
|
||||
{
|
||||
@@ -123,6 +125,7 @@ timeLine::timeLine( const int _xoff, const int _yoff, const float _ppt,
|
||||
timeLine::~timeLine()
|
||||
{
|
||||
m_pos.m_timeLine = NULL;
|
||||
delete m_hint;
|
||||
}
|
||||
|
||||
|
||||
@@ -244,8 +247,8 @@ void timeLine::paintEvent( QPaintEvent * )
|
||||
const QPixmap & lpoint = loopPointsEnabled() ?
|
||||
*s_loopPointPixmap :
|
||||
*s_loopPointDisabledPixmap;
|
||||
p.drawPixmap( markerX( m_loopPos[0] ), 7, lpoint );
|
||||
p.drawPixmap( markerX( m_loopPos[1] ), 7, lpoint );
|
||||
p.drawPixmap( markerX( loopBegin() ), 7, lpoint );
|
||||
p.drawPixmap( markerX( loopEnd() ), 7, lpoint );
|
||||
|
||||
|
||||
tact tact_num = m_begin.getTact();
|
||||
@@ -292,16 +295,41 @@ void timeLine::mousePressEvent( QMouseEvent * _me )
|
||||
s_loopPointPixmap->width() )
|
||||
{
|
||||
m_action = MOVE_LOOP_BEGIN;
|
||||
m_moveXOff = s_loopPointPixmap->width() / 2;
|
||||
}
|
||||
else if( _me->x() >= markerX( loopEnd() ) &&
|
||||
_me->x() <= markerX( loopEnd() ) +
|
||||
s_loopPointPixmap->width() )
|
||||
{
|
||||
m_action = MOVE_LOOP_END;
|
||||
}
|
||||
if( m_action != NONE )
|
||||
{
|
||||
m_moveXOff = s_loopPointPixmap->width() / 2;
|
||||
}
|
||||
}
|
||||
else if( _me->button() == Qt::MidButton )
|
||||
{
|
||||
const midiTime t = m_begin +
|
||||
static_cast<Sint32>( _me->x() * 64 / m_ppt );
|
||||
Uint8 pmin = 0;
|
||||
Uint8 pmax = 1;
|
||||
m_action = MOVE_LOOP_BEGIN;
|
||||
if( m_loopPos[pmin] > m_loopPos[pmax] )
|
||||
{
|
||||
qSwap( pmin, pmax );
|
||||
m_action = MOVE_LOOP_END;
|
||||
}
|
||||
if( lmmsMainWin::isShiftPressed() == TRUE )
|
||||
{
|
||||
m_loopPos[pmax] = t;
|
||||
m_action = ( m_action == MOVE_LOOP_BEGIN ) ?
|
||||
MOVE_LOOP_END : MOVE_LOOP_BEGIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_loopPos[pmin] = t;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_action = MOVE_POS_MARKER;
|
||||
@@ -314,6 +342,14 @@ void timeLine::mousePressEvent( QMouseEvent * _me )
|
||||
m_moveXOff = s_posMarkerPixmap->width() / 2;
|
||||
}
|
||||
}
|
||||
if( m_action == MOVE_LOOP_BEGIN || m_action == MOVE_LOOP_END )
|
||||
{
|
||||
delete m_hint;
|
||||
m_hint = textFloat::displayMessage( tr( "Hint" ),
|
||||
tr( "Press <Ctrl> to disable magnetic "
|
||||
"loop-points." ),
|
||||
embed::getIconPixmap( "hint" ), 0 );
|
||||
}
|
||||
mouseMoveEvent( _me );
|
||||
}
|
||||
|
||||
@@ -334,14 +370,27 @@ void timeLine::mouseMoveEvent( QMouseEvent * _me )
|
||||
break;
|
||||
|
||||
case MOVE_LOOP_BEGIN:
|
||||
m_loopPos[0] = t.getTact() * 64;
|
||||
update();
|
||||
break;
|
||||
|
||||
case MOVE_LOOP_END:
|
||||
m_loopPos[1] = t.getTact() * 64;
|
||||
{
|
||||
Uint8 i = m_action - MOVE_LOOP_BEGIN;
|
||||
if( lmmsMainWin::isCtrlPressed() == TRUE )
|
||||
{
|
||||
// no ctrl-press-hint when having ctrl pressed
|
||||
delete m_hint;
|
||||
m_hint = NULL;
|
||||
m_loopPos[i] = t;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_loopPos[i] = t.getTact() * 64;
|
||||
if( t.getTact64th() >= 32 )
|
||||
{
|
||||
m_loopPos[i] += 64;
|
||||
}
|
||||
}
|
||||
update();
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
@@ -353,6 +402,8 @@ void timeLine::mouseMoveEvent( QMouseEvent * _me )
|
||||
|
||||
void timeLine::mouseReleaseEvent( QMouseEvent * _me )
|
||||
{
|
||||
delete m_hint;
|
||||
m_hint = NULL;
|
||||
m_action = NONE;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,6 +58,10 @@
|
||||
#include "pixmap_button.h"
|
||||
#include "debug.h"
|
||||
#include "tooltip.h"
|
||||
#include "string_pair_drag.h"
|
||||
#include "mmp.h"
|
||||
#include "lmms_main_win.h"
|
||||
#include "text_float.h"
|
||||
|
||||
|
||||
|
||||
@@ -68,6 +72,8 @@ const Uint16 TRACK_OP_BTN_HEIGHT = 14;
|
||||
|
||||
|
||||
|
||||
textFloat * trackContentObject::s_textFloat = NULL;
|
||||
|
||||
|
||||
// ===========================================================================
|
||||
// trackContentObject
|
||||
@@ -86,6 +92,13 @@ trackContentObject::trackContentObject( track * _track ) :
|
||||
m_autoResize( FALSE ),
|
||||
m_initialMouseX( 0 )
|
||||
{
|
||||
if( s_textFloat == NULL )
|
||||
{
|
||||
s_textFloat = new textFloat( this );
|
||||
s_textFloat->setPixmap( embed::getIconPixmap(
|
||||
"xclock", 24, 24 ) );
|
||||
}
|
||||
|
||||
#ifdef QT4
|
||||
setAttribute( Qt::WA_DeleteOnClose );
|
||||
setFocusPolicy( Qt::StrongFocus );
|
||||
@@ -95,9 +108,10 @@ trackContentObject::trackContentObject( track * _track ) :
|
||||
show();
|
||||
movePosition( 0 );
|
||||
changeLength( 0 );
|
||||
setFixedHeight( parentWidget()->height()-2 );
|
||||
// if( useFixedWidth() )
|
||||
// setFixedWidth( _channel_track->getTrackContentWidget()->width() );
|
||||
|
||||
setFixedHeight( parentWidget()->height() - 2 );
|
||||
setAcceptDrops( TRUE );
|
||||
setMouseTracking( TRUE );
|
||||
}
|
||||
|
||||
|
||||
@@ -129,7 +143,6 @@ void trackContentObject::movePosition( const midiTime & _pos )
|
||||
// moving of TCO can result in change of song-length etc.,
|
||||
// therefore we update the trackcontainer
|
||||
m_track->getTrackContainer()->update();
|
||||
setMouseTracking( TRUE );
|
||||
}
|
||||
|
||||
|
||||
@@ -166,25 +179,103 @@ float trackContentObject::pixelsPerTact( void )
|
||||
|
||||
|
||||
|
||||
void trackContentObject::dragEnterEvent( QDragEnterEvent * _dee )
|
||||
{
|
||||
stringPairDrag::processDragEnterEvent( _dee, "tco_" +
|
||||
QString::number( m_track->type() ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackContentObject::dropEvent( QDropEvent * _de )
|
||||
{
|
||||
QString type = stringPairDrag::decodeKey( _de );
|
||||
QString value = stringPairDrag::decodeValue( _de );
|
||||
if( type == ( "tco_" + QString::number( m_track->type() ) ) )
|
||||
{
|
||||
// value contains our XML-data so simply create a
|
||||
// multimediaProject which does the rest for us...
|
||||
multimediaProject mmp( value, FALSE );
|
||||
// at least save position before getting to moved to somewhere
|
||||
// the user doesn't expect...
|
||||
midiTime pos = startPosition();
|
||||
loadSettings( mmp.content().firstChild().toElement() );
|
||||
movePosition( pos );
|
||||
_de->accept();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackContentObject::leaveEvent( QEvent * _e )
|
||||
{
|
||||
while( QApplication::overrideCursor() != NULL )
|
||||
{
|
||||
QApplication::restoreOverrideCursor();
|
||||
}
|
||||
if( _e != NULL )
|
||||
{
|
||||
QWidget::leaveEvent( _e );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackContentObject::mousePressEvent( QMouseEvent * _me )
|
||||
{
|
||||
if( _me->button() == Qt::LeftButton && fixedTCOs() == FALSE )
|
||||
if( _me->button() == Qt::LeftButton && lmmsMainWin::isCtrlPressed() )
|
||||
{
|
||||
m_initialMouseX = _me->x() - TCO_BORDER_WIDTH;
|
||||
multimediaProject mmp( multimediaProject::DRAG_N_DROP_DATA );
|
||||
saveSettings( mmp, mmp.content() );
|
||||
#ifdef QT4
|
||||
QPixmap thumbnail = QPixmap::grabWidget( this ).scaled(
|
||||
128, 128,
|
||||
Qt::KeepAspectRatio,
|
||||
Qt::SmoothTransformation );
|
||||
#else
|
||||
QSize s( size() );
|
||||
s.scale( 128, 128, QSize::ScaleMin );
|
||||
QPixmap thumbnail = QPixmap::grabWidget( this ).
|
||||
convertToImage().smoothScale( s );
|
||||
#endif
|
||||
new stringPairDrag( "tco_" +
|
||||
QString::number( m_track->type() ),
|
||||
mmp.toString(), thumbnail, this );
|
||||
}
|
||||
else if( _me->button() == Qt::LeftButton &&
|
||||
/* lmmsMainWin::isShiftPressed() == FALSE &&*/
|
||||
fixedTCOs() == FALSE )
|
||||
{
|
||||
m_initialMouseX = _me->x();
|
||||
|
||||
if( _me->x() < width()-RESIZE_GRIP_WIDTH )
|
||||
if( _me->x() < width() - RESIZE_GRIP_WIDTH )
|
||||
{
|
||||
m_moving = TRUE;
|
||||
QCursor c( Qt::SizeAllCursor );
|
||||
QApplication::setOverrideCursor( c );
|
||||
s_textFloat->setTitle( tr( "Current position" ) );
|
||||
}
|
||||
else if( m_autoResize == FALSE )
|
||||
{
|
||||
m_resizing = TRUE;
|
||||
QCursor c( Qt::SizeHorCursor );
|
||||
QApplication::setOverrideCursor( c );
|
||||
s_textFloat->setTitle( tr( "Current length" ) );
|
||||
}
|
||||
s_textFloat->reparent( this );
|
||||
// setup text-float as if TCO was already moved/resized
|
||||
mouseMoveEvent( _me );
|
||||
s_textFloat->show();
|
||||
}
|
||||
else if( ( _me->button() == Qt::MidButton/* ||
|
||||
( _me->button() == Qt::LeftButton &&
|
||||
lmmsMainWin::isShiftPressed() == TRUE )*/ ) &&
|
||||
fixedTCOs() == FALSE )
|
||||
{
|
||||
close();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,15 +292,25 @@ void trackContentObject::mouseMoveEvent( QMouseEvent * _me )
|
||||
currentPosition() +
|
||||
static_cast<int>( x * 64 / ppt ) ) );
|
||||
m_track->getTrackWidget()->changePosition();
|
||||
s_textFloat->setText( QString( "%1:%2" ).
|
||||
arg( m_startPosition.getTact() + 1 ).
|
||||
arg( m_startPosition.getTact64th() ) );
|
||||
s_textFloat->move( mapTo( topLevelWidget(), QPoint( 0, 0 ) ) +
|
||||
QPoint( -2 - s_textFloat->width(), 8 ) );
|
||||
}
|
||||
else if( m_resizing )
|
||||
{
|
||||
changeLength( tMax( 64,
|
||||
static_cast<int>( _me->x() * 64 / ppt ) ) );
|
||||
s_textFloat->setText( QString( "%1:%2" ).
|
||||
arg( length().getTact() + 1 ).
|
||||
arg( length().getTact64th() ) );
|
||||
s_textFloat->move( mapTo( topLevelWidget(), QPoint( 0, 0 ) ) +
|
||||
QPoint( width() + 2, 8 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( _me->x() >= width()-RESIZE_GRIP_WIDTH )
|
||||
if( _me->x() > width() - RESIZE_GRIP_WIDTH )
|
||||
{
|
||||
if( QApplication::overrideCursor() != NULL &&
|
||||
QApplication::overrideCursor()->shape() !=
|
||||
@@ -225,10 +326,7 @@ void trackContentObject::mouseMoveEvent( QMouseEvent * _me )
|
||||
}
|
||||
else
|
||||
{
|
||||
while( QApplication::overrideCursor() != NULL )
|
||||
{
|
||||
QApplication::restoreOverrideCursor();
|
||||
}
|
||||
leaveEvent( NULL );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -238,10 +336,8 @@ void trackContentObject::mouseMoveEvent( QMouseEvent * _me )
|
||||
|
||||
void trackContentObject::mouseReleaseEvent( QMouseEvent * _me )
|
||||
{
|
||||
while( QApplication::overrideCursor() != NULL )
|
||||
{
|
||||
QApplication::restoreOverrideCursor();
|
||||
}
|
||||
s_textFloat->hide();
|
||||
leaveEvent( NULL );
|
||||
m_moving = FALSE;
|
||||
m_resizing = FALSE;
|
||||
}
|
||||
@@ -255,7 +351,8 @@ void trackContentObject::contextMenuEvent( QContextMenuEvent * _cme )
|
||||
if( fixedTCOs() == FALSE )
|
||||
{
|
||||
contextMenu.addAction( embed::getIconPixmap( "cancel" ),
|
||||
tr( "Delete" ), this, SLOT( close() ) );
|
||||
tr( "Delete (middle mousebutton)" ),
|
||||
this, SLOT( close() ) );
|
||||
#ifdef QT4
|
||||
contextMenu.addSeparator();
|
||||
#else
|
||||
@@ -344,6 +441,7 @@ trackContentWidget::trackContentWidget( trackWidget * _parent ) :
|
||||
setPaletteBackgroundColor( QColor( 96, 96, 96 ) );
|
||||
#endif
|
||||
setMouseTracking( TRUE );
|
||||
setAcceptDrops( TRUE );
|
||||
}
|
||||
|
||||
|
||||
@@ -364,9 +462,8 @@ trackContentObject * FASTCALL trackContentWidget::getTCO( csize _tco_num )
|
||||
}
|
||||
printf( "called trackContentWidget::getTCO( %d, TRUE ), "
|
||||
" but TCO %d doesn't exist\n", _tco_num, _tco_num );
|
||||
//m_trackWidget->getTrack().addTCO(
|
||||
// m_trackWidget->getTrack().createTCO() );
|
||||
return( NULL );
|
||||
return( getTrack()->addTCO( getTrack()->createTCO( _tco_num * 64 ) ) );
|
||||
// return( NULL );
|
||||
}
|
||||
|
||||
|
||||
@@ -384,7 +481,7 @@ trackContentObject * FASTCALL trackContentWidget::addTCO(
|
||||
trackContentObject * _tco )
|
||||
{
|
||||
m_trackContentObjects.push_back( _tco );
|
||||
_tco->move( 0, 1 );//(m_trackWidget->height()-_tco->height())/2 );
|
||||
_tco->move( 0, 1 );
|
||||
m_trackWidget->changePosition();
|
||||
songEditor::inst()->setModified();
|
||||
return( _tco ); // just for convenience
|
||||
@@ -511,24 +608,49 @@ void trackContentWidget::updateTCOs( void )
|
||||
|
||||
|
||||
|
||||
void trackContentWidget::dragEnterEvent( QDragEnterEvent * _dee )
|
||||
{
|
||||
stringPairDrag::processDragEnterEvent( _dee, "tco_" +
|
||||
QString::number( getTrack()->type() ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackContentWidget::dropEvent( QDropEvent * _de )
|
||||
{
|
||||
QString type = stringPairDrag::decodeKey( _de );
|
||||
QString value = stringPairDrag::decodeValue( _de );
|
||||
if( type == ( "tco_" + QString::number( getTrack()->type() ) ) &&
|
||||
getTrack()->getTrackContainer()->fixedTCOs() == FALSE )
|
||||
{
|
||||
const midiTime position = getPosition( _de->pos().x() );
|
||||
trackContentObject * tco = addTCO( getTrack()->createTCO(
|
||||
position ) );
|
||||
// value contains our XML-data so simply create a
|
||||
// multimediaProject which does the rest for us...
|
||||
multimediaProject mmp( value, FALSE );
|
||||
// at least save position before getting to moved to somewhere
|
||||
// the user doesn't expect...
|
||||
tco->loadSettings( mmp.content().firstChild().toElement() );
|
||||
tco->movePosition( position );
|
||||
_de->accept();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void trackContentWidget::mousePressEvent( QMouseEvent * _me )
|
||||
{
|
||||
if( _me->button() == Qt::LeftButton &&
|
||||
m_trackWidget->getTrack()->getTrackContainer()->fixedTCOs() ==
|
||||
FALSE )
|
||||
getTrack()->getTrackContainer()->fixedTCOs() == FALSE )
|
||||
{
|
||||
const midiTime position = midiTime( m_trackWidget->getTrack()->
|
||||
getTrackContainer()->
|
||||
currentPosition() + _me->x() *
|
||||
64 /
|
||||
static_cast<int>(
|
||||
m_trackWidget->
|
||||
getTrack()->
|
||||
getTrackContainer()->
|
||||
pixelsPerTact()
|
||||
) );
|
||||
trackContentObject * tco = addTCO( m_trackWidget->getTrack()->
|
||||
createTCO( position ) );
|
||||
const midiTime position = getPosition( _me->x() );
|
||||
trackContentObject * tco = addTCO( getTrack()->createTCO(
|
||||
position ) );
|
||||
tco->movePosition( position );
|
||||
}
|
||||
}
|
||||
@@ -570,6 +692,61 @@ void trackContentWidget::resizeEvent( QResizeEvent * _re )
|
||||
|
||||
|
||||
|
||||
track * trackContentWidget::getTrack( void )
|
||||
{
|
||||
return( m_trackWidget->getTrack() );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
midiTime trackContentWidget::getPosition( int _mouse_x )
|
||||
{
|
||||
const trackContainer * tc = getTrack()->getTrackContainer();
|
||||
return( midiTime( tc->currentPosition() + _mouse_x * 64 /
|
||||
static_cast<int>( tc->pixelsPerTact() ) ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// ===========================================================================
|
||||
// trackSettingsWidget
|
||||
// ===========================================================================
|
||||
|
||||
trackSettingsWidget::trackSettingsWidget( trackWidget * _parent ) :
|
||||
QWidget( _parent ),
|
||||
m_trackWidget( _parent )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
trackSettingsWidget::~trackSettingsWidget()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackSettingsWidget::mousePressEvent( QMouseEvent * _me )
|
||||
{
|
||||
if( _me->button() == Qt::LeftButton &&
|
||||
m_trackWidget->getTrack()->type() != track::BB_TRACK )
|
||||
{
|
||||
multimediaProject mmp( multimediaProject::DRAG_N_DROP_DATA );
|
||||
m_trackWidget->getTrack()->saveSettings( mmp, mmp.content() );
|
||||
new stringPairDrag( "track_" +
|
||||
QString::number( m_trackWidget->getTrack()->type() ),
|
||||
mmp.toString(), QPixmap::grabWidget( this ), this );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// ===========================================================================
|
||||
// trackWidget
|
||||
@@ -677,6 +854,8 @@ trackWidget::trackWidget( track * _track, QWidget * _parent ) :
|
||||
#ifndef QT4
|
||||
setBackgroundMode( Qt::NoBackground );
|
||||
#endif
|
||||
setAcceptDrops( TRUE );
|
||||
setMouseTracking( TRUE );
|
||||
}
|
||||
|
||||
|
||||
@@ -689,62 +868,6 @@ trackWidget::~trackWidget()
|
||||
|
||||
|
||||
|
||||
void trackWidget::paintEvent( QPaintEvent * _pe )
|
||||
{
|
||||
#ifdef QT4
|
||||
QPainter p( this );
|
||||
#else
|
||||
// create pixmap for whole widget
|
||||
QPixmap pm( rect().size() );
|
||||
pm.fill( QColor( 128, 128, 128 ) );
|
||||
|
||||
// and a painter for it
|
||||
QPainter p( &pm );
|
||||
#endif
|
||||
p.setPen( QColor( 0, 0, 0 ) );
|
||||
p.drawLine( 0, height()-1, width()-1, height()-1 );
|
||||
|
||||
#ifndef QT4
|
||||
// blit drawn pixmap to actual widget
|
||||
bitBlt( this, rect().topLeft(), &pm );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::cloneTrack( void )
|
||||
{
|
||||
m_track->getTrackContainer()->cloneTrack( m_track );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::removeTrack( void )
|
||||
{
|
||||
m_track->getTrackContainer()->removeTrack( m_track );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::moveTrackUp( void )
|
||||
{
|
||||
m_track->getTrackContainer()->moveTrackUp( m_track );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::moveTrackDown( void )
|
||||
{
|
||||
m_track->getTrackContainer()->moveTrackDown( m_track );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
bool trackWidget::muted( void ) const
|
||||
{
|
||||
#ifdef QT4
|
||||
@@ -757,39 +880,6 @@ bool trackWidget::muted( void ) const
|
||||
|
||||
|
||||
|
||||
void trackWidget::setMuted( bool _muted )
|
||||
{
|
||||
#ifdef QT4
|
||||
m_muteBtn->setChecked( _muted );
|
||||
#else
|
||||
m_muteBtn->setOn( _muted );
|
||||
#endif
|
||||
m_trackContentWidget.updateTCOs();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::muteBtnRightClicked( void )
|
||||
{
|
||||
bool m = muted();
|
||||
m_track->getTrackContainer()->setMutedOfAllTracks( m );
|
||||
setMuted( !m );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
midiTime trackWidget::endPosition( const midiTime & _pos_start )
|
||||
{
|
||||
const float ppt = m_track->getTrackContainer()->pixelsPerTact();
|
||||
const int cww = m_trackContentWidget.width();
|
||||
return( _pos_start + static_cast<int>( cww * 64 / ppt ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// resposible for moving track-content-widgets to appropriate position after
|
||||
// change of visible viewport
|
||||
void trackWidget::changePosition( const midiTime & _new_pos )
|
||||
@@ -830,6 +920,111 @@ void trackWidget::changePosition( const midiTime & _new_pos )
|
||||
|
||||
|
||||
|
||||
void trackWidget::cloneTrack( void )
|
||||
{
|
||||
m_track->getTrackContainer()->cloneTrack( m_track );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::removeTrack( void )
|
||||
{
|
||||
m_track->getTrackContainer()->removeTrack( m_track );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::moveTrackUp( void )
|
||||
{
|
||||
m_track->getTrackContainer()->moveTrackUp( m_track );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::moveTrackDown( void )
|
||||
{
|
||||
m_track->getTrackContainer()->moveTrackDown( m_track );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::setMuted( bool _muted )
|
||||
{
|
||||
#ifdef QT4
|
||||
m_muteBtn->setChecked( _muted );
|
||||
#else
|
||||
m_muteBtn->setOn( _muted );
|
||||
#endif
|
||||
m_trackContentWidget.updateTCOs();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::muteBtnRightClicked( void )
|
||||
{
|
||||
bool m = muted();
|
||||
m_track->getTrackContainer()->setMutedOfAllTracks( m );
|
||||
setMuted( !m );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::dragEnterEvent( QDragEnterEvent * _dee )
|
||||
{
|
||||
stringPairDrag::processDragEnterEvent( _dee, "track_" +
|
||||
QString::number( m_track->type() ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::dropEvent( QDropEvent * _de )
|
||||
{
|
||||
QString type = stringPairDrag::decodeKey( _de );
|
||||
QString value = stringPairDrag::decodeValue( _de );
|
||||
if( type == ( "track_" + QString::number( m_track->type() ) ) )
|
||||
{
|
||||
// value contains our XML-data so simply create a
|
||||
// multimediaProject which does the rest for us...
|
||||
multimediaProject mmp( value, FALSE );
|
||||
m_track->loadSettings( mmp.content().firstChild().toElement() );
|
||||
_de->accept();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::paintEvent( QPaintEvent * _pe )
|
||||
{
|
||||
#ifdef QT4
|
||||
QPainter p( this );
|
||||
#else
|
||||
// create pixmap for whole widget
|
||||
QPixmap pm( rect().size() );
|
||||
pm.fill( QColor( 128, 128, 128 ) );
|
||||
|
||||
// and a painter for it
|
||||
QPainter p( &pm );
|
||||
#endif
|
||||
p.setPen( QColor( 0, 0, 0 ) );
|
||||
p.drawLine( 0, height() - 1, width() - 1, height() - 1 );
|
||||
|
||||
#ifndef QT4
|
||||
// blit drawn pixmap to actual widget
|
||||
bitBlt( this, rect().topLeft(), &pm );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void trackWidget::resizeEvent( QResizeEvent * _re )
|
||||
{
|
||||
m_trackOperationsWidget.setFixedSize( TRACK_OP_WIDTH, height() - 1 );
|
||||
@@ -848,6 +1043,18 @@ void trackWidget::resizeEvent( QResizeEvent * _re )
|
||||
|
||||
|
||||
|
||||
midiTime trackWidget::endPosition( const midiTime & _pos_start )
|
||||
{
|
||||
const float ppt = m_track->getTrackContainer()->pixelsPerTact();
|
||||
const int cww = m_trackContentWidget.width();
|
||||
return( _pos_start + static_cast<int>( cww * 64 / ppt ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// ===========================================================================
|
||||
// track
|
||||
// ===========================================================================
|
||||
@@ -894,6 +1101,7 @@ track * FASTCALL track::create( trackTypes _tt, trackContainer * _tc )
|
||||
|
||||
|
||||
|
||||
|
||||
track * FASTCALL track::create( const QDomElement & _this,
|
||||
trackContainer * _tc )
|
||||
{
|
||||
@@ -934,7 +1142,7 @@ void FASTCALL track::saveSettings( QDomDocument & _doc, QDomElement & _parent )
|
||||
csize num_of_tcos = getTrackContentWidget()->numOfTCOs();
|
||||
|
||||
QDomElement track_de = _doc.createElement( "track" );
|
||||
track_de.setAttribute( "type", QString::number( trackType() ) );
|
||||
track_de.setAttribute( "type", QString::number( type() ) );
|
||||
track_de.setAttribute( "muted", muted() );
|
||||
_parent.appendChild( track_de );
|
||||
|
||||
@@ -955,7 +1163,7 @@ void FASTCALL track::saveSettings( QDomDocument & _doc, QDomElement & _parent )
|
||||
|
||||
void FASTCALL track::loadSettings( const QDomElement & _this )
|
||||
{
|
||||
if( _this.attribute( "type" ).toInt() != trackType() )
|
||||
if( _this.attribute( "type" ).toInt() != type() )
|
||||
{
|
||||
qWarning( "Current track-type does not match track-type of "
|
||||
"settings-node!\n" );
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#include "channel_track.h"
|
||||
#include "mmp.h"
|
||||
#include "config_mgr.h"
|
||||
#include "midi_file.h"
|
||||
|
||||
|
||||
|
||||
@@ -309,7 +310,7 @@ unsigned int trackContainer::countTracks( track::trackTypes _tt ) const
|
||||
for( trackWidgetVector::const_iterator it = m_trackWidgets.begin();
|
||||
it != m_trackWidgets.end(); ++it )
|
||||
{
|
||||
if( ( *it )->getTrack()->trackType() == _tt ||
|
||||
if( ( *it )->getTrack()->type() == _tt ||
|
||||
_tt == track::TOTAL_TRACK_TYPES )
|
||||
{
|
||||
++cnt;
|
||||
@@ -379,7 +380,10 @@ void trackContainer::resizeEvent( QResizeEvent * )
|
||||
|
||||
void trackContainer::dragEnterEvent( QDragEnterEvent * _dee )
|
||||
{
|
||||
stringPairDrag::processDragEnterEvent( _dee, "preset,plugin" );
|
||||
stringPairDrag::processDragEnterEvent( _dee,
|
||||
QString( "presetfile,instrument,midifile,track_%1,track_%2" ).
|
||||
arg( track::CHANNEL_TRACK ).
|
||||
arg( track::SAMPLE_TRACK ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -389,15 +393,16 @@ void trackContainer::dropEvent( QDropEvent * _de )
|
||||
{
|
||||
QString type = stringPairDrag::decodeKey( _de );
|
||||
QString value = stringPairDrag::decodeValue( _de );
|
||||
if( type == "plugin" )
|
||||
if( type == "instrument" )
|
||||
{
|
||||
channelTrack * ct = dynamic_cast<channelTrack *>(
|
||||
track::create( track::CHANNEL_TRACK,
|
||||
this ) );
|
||||
ct->loadInstrument( value );
|
||||
ct->toggledChannelButton( TRUE );
|
||||
_de->accept();
|
||||
}
|
||||
else if( type == "preset" )
|
||||
else if( type == "presetfile" )
|
||||
{
|
||||
multimediaProject mmp( value );
|
||||
channelTrack * ct = dynamic_cast<channelTrack *>(
|
||||
@@ -406,6 +411,22 @@ void trackContainer::dropEvent( QDropEvent * _de )
|
||||
ct->loadTrackSpecificSettings( mmp.content().firstChild().
|
||||
toElement() );
|
||||
ct->toggledChannelButton( TRUE );
|
||||
_de->accept();
|
||||
}
|
||||
else if( type == "midifile" )
|
||||
{
|
||||
midiFile mf( value );
|
||||
mf.importToTrackContainer( this );
|
||||
_de->accept();
|
||||
}
|
||||
else if( type.left( 6 ) == "track_" )
|
||||
{
|
||||
multimediaProject mmp( value, FALSE );
|
||||
track::create( mmp.content().firstChild().toElement(), this );
|
||||
// after adding a track, we have to make sure, actual editor
|
||||
// can setup new track (e.g. adding TCO's (bbEditor does so))
|
||||
updateAfterTrackAdd();
|
||||
_de->accept();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -415,7 +436,7 @@ void trackContainer::dropEvent( QDropEvent * _de )
|
||||
void trackContainer::updateScrollArea( void )
|
||||
{
|
||||
m_scrollArea->resize( tMax( m_scrollArea->parentWidget()->width() -
|
||||
m_scrollArea->x()-2, 0 ),
|
||||
m_scrollArea->x() - 2, 0 ),
|
||||
tMax( m_scrollArea->parentWidget()->height() -
|
||||
m_scrollArea->y() - 2, 0 ) );
|
||||
//m_scrollArea->updateContents();
|
||||
|
||||
@@ -33,21 +33,19 @@
|
||||
|
||||
#include <QDir>
|
||||
#include <QFileInfo>
|
||||
#include <QLibrary>
|
||||
|
||||
#else
|
||||
|
||||
#include <qdir.h>
|
||||
#include <qfileinfo.h>
|
||||
#include <qlibrary.h>
|
||||
|
||||
#define value data
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef HAVE_DLFCN_H
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
|
||||
|
||||
@@ -58,14 +56,11 @@ ladspaManager * ladspaManager::s_instanceOfMe = NULL;
|
||||
|
||||
ladspaManager::ladspaManager( void )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction;
|
||||
void * pluginHandle;
|
||||
|
||||
// TODO Need to move the search path definition to the config file to
|
||||
// have more control over where it tries to find the plugins.
|
||||
#ifdef QT4
|
||||
QStringList ladspaDirectories = QString( getenv( "LADSPA_PATH" ) ).
|
||||
split( ' ' );
|
||||
split( ':' );
|
||||
#else
|
||||
QStringList ladspaDirectories = QStringList::split( ':',
|
||||
QString( getenv( "LADSPA_PATH" ) ) );
|
||||
@@ -100,7 +95,8 @@ ladspaManager::ladspaManager( void )
|
||||
#else
|
||||
const QFileInfo & f = **file;
|
||||
#endif
|
||||
pluginHandle = dlopen( f.absoluteFilePath().
|
||||
QLibrary plugin_lib( f.absoluteFilePath() );
|
||||
/* pluginHandle = dlopen( f.absoluteFilePath().
|
||||
#ifdef QT4
|
||||
toAscii().constData(),
|
||||
#else
|
||||
@@ -109,18 +105,22 @@ ladspaManager::ladspaManager( void )
|
||||
RTLD_LAZY );
|
||||
if( pluginHandle )
|
||||
{
|
||||
dlerror();
|
||||
descriptorFunction
|
||||
= ( LADSPA_Descriptor_Function )
|
||||
dlsym( pluginHandle,
|
||||
dlerror();*/
|
||||
if( plugin_lib.load() == TRUE )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
( LADSPA_Descriptor_Function ) plugin_lib.resolve(
|
||||
"ladspa_descriptor" );
|
||||
if( dlerror() == NULL && descriptorFunction )
|
||||
if( /*dlerror() == NULL &&*/
|
||||
descriptorFunction != NULL )
|
||||
{
|
||||
addPlugins( pluginHandle,
|
||||
descriptorFunction,
|
||||
f.fileName() );
|
||||
#ifndef QT4
|
||||
plugin_lib.setAutoUnload( FALSE );
|
||||
#endif
|
||||
addPlugins( descriptorFunction,
|
||||
f.fileName() );
|
||||
}
|
||||
else
|
||||
/* else
|
||||
{
|
||||
dlclose( ( void * )
|
||||
f.absoluteFilePath().
|
||||
@@ -130,7 +130,7 @@ ladspaManager::ladspaManager( void )
|
||||
ascii()
|
||||
#endif
|
||||
);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -141,20 +141,21 @@ ladspaManager::ladspaManager( void )
|
||||
|
||||
ladspaManager::~ladspaManager()
|
||||
{
|
||||
for( ladspaManagerMapType::Iterator it = m_ladspaManagerMap.begin();
|
||||
// we trust in auto-unloading-mechanisms of OS
|
||||
/* for( ladspaManagerMapType::Iterator it = m_ladspaManagerMap.begin();
|
||||
it != m_ladspaManagerMap.end(); ++it )
|
||||
{
|
||||
dlclose( it.value()->pluginHandle );
|
||||
}
|
||||
m_ladspaManagerMap.clear();
|
||||
m_ladspaManagerMap.clear();*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void FASTCALL ladspaManager::addPlugins( void * _plugin_handle,
|
||||
LADSPA_Descriptor_Function _descriptor_func,
|
||||
const QString & _file )
|
||||
void FASTCALL ladspaManager::addPlugins(
|
||||
LADSPA_Descriptor_Function _descriptor_func,
|
||||
const QString & _file )
|
||||
{
|
||||
const LADSPA_Descriptor * descriptor;
|
||||
long pluginIndex = 0;
|
||||
@@ -163,7 +164,6 @@ void FASTCALL ladspaManager::addPlugins( void * _plugin_handle,
|
||||
{
|
||||
ladspaManagerDescription * plugIn =
|
||||
new ladspaManagerDescription;
|
||||
plugIn->pluginHandle = _plugin_handle;
|
||||
plugIn->descriptorFunction = _descriptor_func;
|
||||
plugIn->index = pluginIndex;
|
||||
|
||||
@@ -180,10 +180,11 @@ QString FASTCALL ladspaManager::getLabel( const ladspaKey & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( QString( descriptor->Label ) );
|
||||
}
|
||||
else
|
||||
@@ -199,10 +200,11 @@ bool FASTCALL ladspaManager::hasRealTimeDependency( const ladspaKey & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( LADSPA_IS_REALTIME( descriptor->Properties ) );
|
||||
}
|
||||
else
|
||||
@@ -218,10 +220,11 @@ bool FASTCALL ladspaManager::isInplaceBroken( const ladspaKey & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( LADSPA_IS_INPLACE_BROKEN( descriptor->Properties ) );
|
||||
}
|
||||
else
|
||||
@@ -237,10 +240,11 @@ bool FASTCALL ladspaManager::isRealTimeCapable( const ladspaKey & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( LADSPA_IS_HARD_RT_CAPABLE( descriptor->Properties ) );
|
||||
}
|
||||
else
|
||||
@@ -256,10 +260,11 @@ QString FASTCALL ladspaManager::getName( const ladspaKey & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( QString( descriptor->Name ) );
|
||||
}
|
||||
else
|
||||
@@ -275,10 +280,11 @@ QString FASTCALL ladspaManager::getMaker( const ladspaKey & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( QString( descriptor->Maker ) );
|
||||
}
|
||||
else
|
||||
@@ -294,10 +300,11 @@ QString FASTCALL ladspaManager::getCopyright( const ladspaKey & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( QString( descriptor->Copyright ) );
|
||||
}
|
||||
else
|
||||
@@ -313,10 +320,11 @@ Uint32 FASTCALL ladspaManager::getPortCount( const ladspaKey & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( descriptor->PortCount );
|
||||
}
|
||||
else
|
||||
@@ -329,15 +337,16 @@ Uint32 FASTCALL ladspaManager::getPortCount( const ladspaKey & _plugin )
|
||||
|
||||
|
||||
bool FASTCALL ladspaManager::isPortInput( const ladspaKey & _plugin,
|
||||
Uint32 _port )
|
||||
Uint32 _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
return( LADSPA_IS_PORT_INPUT
|
||||
( descriptor->PortDescriptors[_port] ) );
|
||||
@@ -352,15 +361,16 @@ bool FASTCALL ladspaManager::isPortInput( const ladspaKey & _plugin,
|
||||
|
||||
|
||||
bool FASTCALL ladspaManager::isPortOutput( const ladspaKey & _plugin,
|
||||
Uint32 _port )
|
||||
Uint32 _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
return( LADSPA_IS_PORT_OUTPUT
|
||||
( descriptor->PortDescriptors[_port] ) );
|
||||
@@ -374,15 +384,17 @@ bool FASTCALL ladspaManager::isPortOutput( const ladspaKey & _plugin,
|
||||
|
||||
|
||||
|
||||
bool FASTCALL ladspaManager::isPortAudio( const ladspaKey & _plugin, Uint32 _port )
|
||||
bool FASTCALL ladspaManager::isPortAudio( const ladspaKey & _plugin,
|
||||
Uint32 _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
return( LADSPA_IS_PORT_AUDIO
|
||||
( descriptor->PortDescriptors[_port] ) );
|
||||
@@ -397,15 +409,16 @@ bool FASTCALL ladspaManager::isPortAudio( const ladspaKey & _plugin, Uint32 _por
|
||||
|
||||
|
||||
bool FASTCALL ladspaManager::isPortControl( const ladspaKey & _plugin,
|
||||
Uint32 _port )
|
||||
Uint32 _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
return( LADSPA_IS_PORT_CONTROL
|
||||
( descriptor->PortDescriptors[_port] ) );
|
||||
@@ -426,14 +439,14 @@ bool FASTCALL ladspaManager::areHintsSampleRateDependent(
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor
|
||||
= descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_SAMPLE_RATE
|
||||
( hintDescriptor ) );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_SAMPLE_RATE ( hintDescriptor ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -450,14 +463,14 @@ float FASTCALL ladspaManager::getLowerBound( const ladspaKey & _plugin,
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor
|
||||
= descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
if( LADSPA_IS_HINT_BOUNDED_BELOW
|
||||
( hintDescriptor ) )
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
if( LADSPA_IS_HINT_BOUNDED_BELOW( hintDescriptor ) )
|
||||
{
|
||||
return( descriptor->PortRangeHints[_port].LowerBound );
|
||||
}
|
||||
@@ -480,14 +493,14 @@ float FASTCALL ladspaManager::getUpperBound( const ladspaKey & _plugin,
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor
|
||||
= descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
if( LADSPA_IS_HINT_BOUNDED_ABOVE
|
||||
( hintDescriptor ) )
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
if( LADSPA_IS_HINT_BOUNDED_ABOVE( hintDescriptor ) )
|
||||
{
|
||||
return( descriptor->PortRangeHints[_port].LowerBound );
|
||||
}
|
||||
@@ -506,19 +519,19 @@ float FASTCALL ladspaManager::getUpperBound( const ladspaKey & _plugin,
|
||||
|
||||
|
||||
bool FASTCALL ladspaManager::isPortToggled( const ladspaKey & _plugin,
|
||||
Uint32 _port )
|
||||
Uint32 _port )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor
|
||||
= descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_TOGGLED
|
||||
( hintDescriptor ) );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_TOGGLED( hintDescriptor ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -535,21 +548,23 @@ float FASTCALL ladspaManager::getDefaultSetting( const ladspaKey & _plugin,
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor
|
||||
= descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
switch( hintDescriptor & LADSPA_HINT_DEFAULT_MASK )
|
||||
{
|
||||
case LADSPA_HINT_DEFAULT_NONE:
|
||||
return( -999e-99 );
|
||||
case LADSPA_HINT_DEFAULT_MINIMUM:
|
||||
return( descriptor->PortRangeHints[_port].LowerBound );
|
||||
return( descriptor->PortRangeHints[_port].
|
||||
LowerBound );
|
||||
case LADSPA_HINT_DEFAULT_LOW:
|
||||
if( LADSPA_IS_HINT_LOGARITHMIC
|
||||
( hintDescriptor ))
|
||||
( hintDescriptor ) )
|
||||
{
|
||||
return( exp( log( descriptor->PortRangeHints[_port].LowerBound )
|
||||
* 0.75
|
||||
@@ -620,14 +635,14 @@ bool FASTCALL ladspaManager::isLogarithmic( const ladspaKey & _plugin,
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor
|
||||
= descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_LOGARITHMIC
|
||||
( hintDescriptor ) );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_LOGARITHMIC( hintDescriptor ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -644,14 +659,14 @@ bool FASTCALL ladspaManager::isInteger( const ladspaKey & _plugin,
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor
|
||||
= descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_INTEGER
|
||||
( hintDescriptor ) );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_PortRangeHintDescriptor hintDescriptor =
|
||||
descriptor->PortRangeHints[_port].HintDescriptor;
|
||||
return( LADSPA_IS_HINT_INTEGER( hintDescriptor ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -668,11 +683,12 @@ QString FASTCALL ladspaManager::getPortName( const ladspaKey & _plugin,
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
|
||||
return( QString( descriptor->PortNames[_port] ) );
|
||||
}
|
||||
else
|
||||
@@ -684,15 +700,16 @@ QString FASTCALL ladspaManager::getPortName( const ladspaKey & _plugin,
|
||||
|
||||
|
||||
|
||||
const void * FASTCALL ladspaManager::getImplementationData( const ladspaKey &
|
||||
_plugin )
|
||||
const void * FASTCALL ladspaManager::getImplementationData(
|
||||
const ladspaKey & _plugin )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( descriptor->ImplementationData );
|
||||
}
|
||||
else
|
||||
@@ -709,10 +726,11 @@ const LADSPA_Descriptor * FASTCALL ladspaManager::getDescriptor(
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( descriptor );
|
||||
}
|
||||
else
|
||||
@@ -729,11 +747,13 @@ LADSPA_Handle FASTCALL ladspaManager::instantiate( const ladspaKey & _plugin,
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
return( ( descriptor->instantiate ) ( descriptor, _sample_rate ) );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
return( ( descriptor->instantiate )
|
||||
( descriptor, _sample_rate ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -752,13 +772,15 @@ void FASTCALL ladspaManager::connectPort( const ladspaKey & _plugin,
|
||||
if( m_ladspaManagerMap.contains( _plugin )
|
||||
&& _port < getPortCount( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->connect_port != NULL )
|
||||
{
|
||||
( descriptor->connect_port ) ( _instance, _port, _data_location );
|
||||
( descriptor->connect_port )
|
||||
( _instance, _port, _data_location );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -771,10 +793,11 @@ void FASTCALL ladspaManager::activate( const ladspaKey & _plugin,
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->activate != NULL )
|
||||
{
|
||||
( descriptor->activate ) ( _instance );
|
||||
@@ -785,15 +808,17 @@ void FASTCALL ladspaManager::activate( const ladspaKey & _plugin,
|
||||
|
||||
|
||||
|
||||
void FASTCALL ladspaManager::run( const ladspaKey & _plugin, LADSPA_Handle _instance,
|
||||
Uint32 _sample_count )
|
||||
void FASTCALL ladspaManager::run( const ladspaKey & _plugin,
|
||||
LADSPA_Handle _instance,
|
||||
Uint32 _sample_count )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->run != NULL )
|
||||
{
|
||||
( descriptor->run ) ( _instance, _sample_count );
|
||||
@@ -805,17 +830,18 @@ void FASTCALL ladspaManager::run( const ladspaKey & _plugin, LADSPA_Handle _inst
|
||||
|
||||
|
||||
void FASTCALL ladspaManager::runAdding( const ladspaKey & _plugin,
|
||||
LADSPA_Handle _instance,
|
||||
Uint32 _sample_count )
|
||||
LADSPA_Handle _instance,
|
||||
Uint32 _sample_count )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->run_adding!=NULL
|
||||
&& descriptor->set_run_adding_gain!=NULL )
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->run_adding != NULL &&
|
||||
descriptor->set_run_adding_gain != NULL )
|
||||
{
|
||||
( descriptor->run_adding ) ( _instance, _sample_count );
|
||||
}
|
||||
@@ -826,19 +852,21 @@ void FASTCALL ladspaManager::runAdding( const ladspaKey & _plugin,
|
||||
|
||||
|
||||
void FASTCALL ladspaManager::setRunAddingGain( const ladspaKey & _plugin,
|
||||
LADSPA_Handle _instance,
|
||||
LADSPA_Data _gain )
|
||||
LADSPA_Handle _instance,
|
||||
LADSPA_Data _gain )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->run_adding!=NULL
|
||||
&& descriptor->set_run_adding_gain!=NULL )
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->run_adding != NULL &&
|
||||
descriptor->set_run_adding_gain != NULL )
|
||||
{
|
||||
( descriptor->set_run_adding_gain ) ( _instance, _gain );
|
||||
( descriptor->set_run_adding_gain )
|
||||
( _instance, _gain );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -851,10 +879,11 @@ void FASTCALL ladspaManager::deactivate( const ladspaKey & _plugin,
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->deactivate != NULL )
|
||||
{
|
||||
( descriptor->deactivate ) ( _instance );
|
||||
@@ -866,14 +895,15 @@ void FASTCALL ladspaManager::deactivate( const ladspaKey & _plugin,
|
||||
|
||||
|
||||
void FASTCALL ladspaManager::cleanup( const ladspaKey & _plugin,
|
||||
LADSPA_Handle _instance )
|
||||
LADSPA_Handle _instance )
|
||||
{
|
||||
if( m_ladspaManagerMap.contains( _plugin ) )
|
||||
{
|
||||
LADSPA_Descriptor_Function descriptorFunction
|
||||
= m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor
|
||||
= descriptorFunction( m_ladspaManagerMap[_plugin]->index );
|
||||
LADSPA_Descriptor_Function descriptorFunction =
|
||||
m_ladspaManagerMap[_plugin]->descriptorFunction;
|
||||
const LADSPA_Descriptor * descriptor =
|
||||
descriptorFunction(
|
||||
m_ladspaManagerMap[_plugin]->index );
|
||||
if( descriptor->cleanup != NULL )
|
||||
{
|
||||
( descriptor->cleanup ) ( _instance );
|
||||
|
||||
@@ -54,6 +54,7 @@ multimediaProject::typeDescStruct
|
||||
{ multimediaProject::SONG_PROJECT, "song" },
|
||||
{ multimediaProject::SONG_PROJECT_TEMPLATE, "songtemplate" },
|
||||
{ multimediaProject::CHANNEL_SETTINGS, "channelsettings" },
|
||||
{ multimediaProject::DRAG_N_DROP_DATA, "dnddata" },
|
||||
{ multimediaProject::EFFECT_SETTINGS, "effectsettings" },
|
||||
{ multimediaProject::VIDEO_PROJECT, "video" },
|
||||
{ multimediaProject::BURN_PROJECT, "burn" },
|
||||
@@ -86,19 +87,22 @@ multimediaProject::multimediaProject( projectTypes _project_type ) :
|
||||
|
||||
|
||||
|
||||
multimediaProject::multimediaProject( const QString & _in_file_name ) :
|
||||
multimediaProject::multimediaProject( const QString & _in_file_name,
|
||||
bool _is_filename ) :
|
||||
QDomDocument(),
|
||||
m_content(),
|
||||
m_head()
|
||||
{
|
||||
QFile in_file( _in_file_name );
|
||||
#ifdef QT4
|
||||
if( !in_file.open( QIODevice::ReadOnly ) )
|
||||
#else
|
||||
if( !in_file.open( IO_ReadOnly ) )
|
||||
#endif
|
||||
if( _is_filename == TRUE )
|
||||
{
|
||||
QMessageBox::critical( NULL,
|
||||
#ifdef QT4
|
||||
if( !in_file.open( QIODevice::ReadOnly ) )
|
||||
#else
|
||||
if( !in_file.open( IO_ReadOnly ) )
|
||||
#endif
|
||||
{
|
||||
QMessageBox::critical( NULL,
|
||||
songEditor::tr( "Could not open file" ),
|
||||
songEditor::tr( "Could not open "
|
||||
"file %1. You probably "
|
||||
@@ -109,15 +113,17 @@ multimediaProject::multimediaProject( const QString & _in_file_name ) :
|
||||
"access to the file "
|
||||
"and try again."
|
||||
).arg( _in_file_name ) );
|
||||
return;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
QString error_msg;
|
||||
int line;
|
||||
int col;
|
||||
if( !setContent( &in_file, &error_msg, &line, &col ) )
|
||||
if( _is_filename == TRUE )
|
||||
{
|
||||
QMessageBox::critical( NULL, songEditor::tr( "Error in "
|
||||
if( !setContent( &in_file, &error_msg, &line, &col ) )
|
||||
{
|
||||
QMessageBox::critical( NULL, songEditor::tr( "Error in "
|
||||
"multimedia-project" ),
|
||||
songEditor::tr( "The multimedia-"
|
||||
"project %1 seems to "
|
||||
@@ -127,9 +133,19 @@ multimediaProject::multimediaProject( const QString & _in_file_name ) :
|
||||
"possible data from "
|
||||
"this file."
|
||||
).arg( _in_file_name ) );
|
||||
return;
|
||||
return;
|
||||
}
|
||||
in_file.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
if( !setContent( _in_file_name, &error_msg, &line, &col ) )
|
||||
{
|
||||
printf( "multimediaProject: error parsing XML-data "
|
||||
"directly given to constructor!\n" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
in_file.close();
|
||||
|
||||
|
||||
QDomElement root = documentElement();
|
||||
|
||||
@@ -79,9 +79,10 @@
|
||||
|
||||
|
||||
|
||||
sampleBuffer::sampleBuffer( const QString & _audio_file ) :
|
||||
sampleBuffer::sampleBuffer( const QString & _audio_file,
|
||||
bool _is_base64_data ) :
|
||||
QObject(),
|
||||
m_audioFile( _audio_file ),
|
||||
m_audioFile( ( _is_base64_data == TRUE ) ? "" : _audio_file ),
|
||||
m_origData( NULL ),
|
||||
m_origFrames( 0 ),
|
||||
m_data( NULL ),
|
||||
@@ -99,6 +100,10 @@ sampleBuffer::sampleBuffer( const QString & _audio_file ) :
|
||||
#ifdef HAVE_SAMPLERATE_H
|
||||
initResampling();
|
||||
#endif
|
||||
if( _is_base64_data == TRUE )
|
||||
{
|
||||
loadFromBase64( _audio_file );
|
||||
}
|
||||
update();
|
||||
}
|
||||
|
||||
@@ -769,8 +774,9 @@ bool FASTCALL sampleBuffer::play( sampleFrame * _ab, Uint32 _start_frame,
|
||||
|
||||
void sampleBuffer::drawWaves( QPainter & _p, QRect _dr, drawMethods _dm )
|
||||
{
|
||||
_p.setClipRect( _dr );
|
||||
_p.setPen (QColor(0x22, 0xFF, 0x44));
|
||||
// _p.setClipRect( _dr );
|
||||
// _p.setPen( QColor( 0x22, 0xFF, 0x44 ) );
|
||||
//_p.setPen( QColor( 64, 224, 160 ) );
|
||||
#ifdef QT4
|
||||
// TODO: save and restore aa-settings
|
||||
_p.setRenderHint( QPainter::Antialiasing );
|
||||
@@ -778,12 +784,12 @@ void sampleBuffer::drawWaves( QPainter & _p, QRect _dr, drawMethods _dm )
|
||||
const int w = _dr.width();
|
||||
const int h = _dr.height();
|
||||
|
||||
const Uint16 y_base = h/2+_dr.y();
|
||||
const float y_space = h/2;
|
||||
const Uint16 y_base = h / 2 + _dr.y();
|
||||
const float y_space = h / 2;
|
||||
|
||||
if( m_data == NULL || m_frames == 0 )
|
||||
{
|
||||
_p.drawLine( _dr.x(), y_base, _dr.x()+w, y_base );
|
||||
_p.drawLine( _dr.x(), y_base, _dr.x() + w, y_base );
|
||||
return;
|
||||
}
|
||||
else if( _dm == LINE_CONNECT )
|
||||
@@ -819,11 +825,11 @@ void sampleBuffer::drawWaves( QPainter & _p, QRect _dr, drawMethods _dm )
|
||||
{
|
||||
const int x = static_cast<int>( frame /
|
||||
(float) m_frames * w ) +
|
||||
_dr.x();
|
||||
_dr.x();
|
||||
for( Uint8 chnl = 0; chnl < DEFAULT_CHANNELS; ++chnl )
|
||||
{
|
||||
const Uint16 y = y_base +
|
||||
static_cast<Uint16>( m_data[frame][chnl]*y_space );
|
||||
static_cast<Uint16>( m_data[frame][chnl] * y_space );
|
||||
_p.drawLine( old_x, old_y[chnl], x, y );
|
||||
old_y[chnl] = y;
|
||||
}
|
||||
@@ -840,12 +846,11 @@ void sampleBuffer::drawWaves( QPainter & _p, QRect _dr, drawMethods _dm )
|
||||
for( Uint8 chnl = 0; chnl < DEFAULT_CHANNELS; ++chnl )
|
||||
{
|
||||
_p.drawPoint( x, y_base +
|
||||
static_cast<Uint16>(
|
||||
m_data[frame][chnl]*y_space ) );
|
||||
static_cast<Uint16>( m_data[frame][chnl] * y_space ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
_p.setClipping( FALSE );
|
||||
// _p.setClipping( FALSE );
|
||||
}
|
||||
|
||||
|
||||
@@ -948,6 +953,85 @@ QString sampleBuffer::openAudioFile( void ) const
|
||||
|
||||
|
||||
|
||||
QString sampleBuffer::toBase64( void ) const
|
||||
{
|
||||
if( m_data == NULL || m_frames == 0 )
|
||||
{
|
||||
return( "" );
|
||||
}
|
||||
#ifdef QT4
|
||||
return( QByteArray::toBase64( QByteArray( m_data, m_frames ) ) );
|
||||
#else
|
||||
// code mostly taken from
|
||||
// qt-x11-opensource-src-4.0.1/src/corelib/tools/qbytearray.cpp
|
||||
|
||||
const char alphabet[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
|
||||
"ghijklmn" "opqrstuv" "wxyz0123" "456789+/";
|
||||
const char padchar = '=';
|
||||
int padlen = 0;
|
||||
|
||||
Uint32 ssize = m_frames * sizeof( sampleFrame );
|
||||
Uint32 dsize = ( ( ssize * 4 ) / 3 ) + 3;
|
||||
const Uint8 * src = (const Uint8 *) m_data;
|
||||
char * ptr = new char[dsize + 1];
|
||||
char * out = ptr;
|
||||
|
||||
Uint32 i = 0;
|
||||
while( i < ssize )
|
||||
{
|
||||
int chunk = 0;
|
||||
chunk |= int( src[i++] ) << 16;
|
||||
if( i == dsize )
|
||||
{
|
||||
padlen = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
chunk |= int( src[i++] ) << 8;
|
||||
if( i == ssize )
|
||||
{
|
||||
padlen = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
chunk |= int( src[i++] );
|
||||
}
|
||||
}
|
||||
|
||||
int j = ( chunk & 0x00fc0000 ) >> 18;
|
||||
int k = ( chunk & 0x0003f000 ) >> 12;
|
||||
int l = ( chunk & 0x00000fc0 ) >> 6;
|
||||
int m = ( chunk & 0x0000003f );
|
||||
*out++ = alphabet[j];
|
||||
*out++ = alphabet[k];
|
||||
if( padlen > 1 )
|
||||
{
|
||||
*out++ = padchar;
|
||||
}
|
||||
else
|
||||
{
|
||||
*out++ = alphabet[l];
|
||||
}
|
||||
if( padlen > 0 )
|
||||
{
|
||||
*out++ = padchar;
|
||||
}
|
||||
else
|
||||
{
|
||||
*out++ = alphabet[m];
|
||||
}
|
||||
}
|
||||
// terminate string
|
||||
ptr[dsize] = 0;
|
||||
QString s( ptr );
|
||||
delete[] ptr;
|
||||
return( s );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void sampleBuffer::setAudioFile( const QString & _audio_file )
|
||||
{
|
||||
m_audioFile = _audio_file;
|
||||
@@ -970,6 +1054,74 @@ void sampleBuffer::setAudioFile( const QString & _audio_file )
|
||||
|
||||
|
||||
|
||||
void sampleBuffer::loadFromBase64( const QString & _data )
|
||||
{
|
||||
delete[] m_origData;
|
||||
|
||||
m_origFrames = _data.length() * 3 / ( 4 * sizeof( sampleFrame ) );
|
||||
m_origData = new sampleFrame[m_origFrames];
|
||||
#ifdef QT4
|
||||
QByteArray data = QByteArray::fromBase64( _audio_file.toAscii() );
|
||||
memcpy( m_origData, data.data(), data.size() );
|
||||
#else
|
||||
// code mostly taken from
|
||||
// qt-x11-opensource-src-4.0.1/src/corelib/tools/qbytearray.cpp
|
||||
unsigned int buf = 0;
|
||||
int nbits = 0;
|
||||
const char * src = _data.ascii();
|
||||
char * dst = (char *) m_origData;
|
||||
csize ssize = _data.length();
|
||||
int offset = 0;
|
||||
|
||||
for( csize i = 0; i < ssize; ++i )
|
||||
{
|
||||
int ch = src[i];
|
||||
int d;
|
||||
|
||||
if( ch >= 'A' && ch <= 'Z' )
|
||||
{
|
||||
d = ch - 'A';
|
||||
}
|
||||
else if( ch >= 'a' && ch <= 'z' )
|
||||
{
|
||||
d = ch - 'a' + 26;
|
||||
}
|
||||
else if( ch >= '0' && ch <= '9' )
|
||||
{
|
||||
d = ch - '0' + 52;
|
||||
}
|
||||
else if( ch == '+' )
|
||||
{
|
||||
d = 62;
|
||||
}
|
||||
else if( ch == '/' )
|
||||
{
|
||||
d = 63;
|
||||
}
|
||||
else
|
||||
{
|
||||
d = -1;
|
||||
}
|
||||
|
||||
if( d != -1 )
|
||||
{
|
||||
buf = ( buf << 6 ) | d;
|
||||
nbits += 6;
|
||||
if( nbits >= 8 )
|
||||
{
|
||||
nbits -= 8;
|
||||
dst[offset++] = buf >> nbits;
|
||||
buf &= ( 1 << nbits ) - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void sampleBuffer::setStartFrame( Uint32 _s )
|
||||
{
|
||||
// don't set this parameter while playing
|
||||
|
||||
@@ -49,10 +49,10 @@ stringPairDrag::stringPairDrag( const QString & _key, const QString & _value,
|
||||
QMimeData * m = new QMimeData();
|
||||
m->setData( "lmms/stringpair", txt.toAscii() );
|
||||
setMimeData( m );
|
||||
start( /*Qt::CopyAction*/ Qt::IgnoreAction );
|
||||
start( Qt::IgnoreAction );
|
||||
#else
|
||||
setEncodedData( txt.utf8() );
|
||||
drag();
|
||||
drag( QDragObject::DragDefault );
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ stringPairDrag::~stringPairDrag()
|
||||
|
||||
|
||||
|
||||
void stringPairDrag::processDragEnterEvent( QDragEnterEvent * _dee,
|
||||
bool stringPairDrag::processDragEnterEvent( QDragEnterEvent * _dee,
|
||||
const QString & _allowed_keys )
|
||||
{
|
||||
#ifdef QT4
|
||||
@@ -79,12 +79,15 @@ void stringPairDrag::processDragEnterEvent( QDragEnterEvent * _dee,
|
||||
if( _allowed_keys.split( ',' ).contains( txt.section( ':', 0, 0 ) ) )
|
||||
{
|
||||
_dee->acceptProposedAction();
|
||||
return( TRUE );
|
||||
}
|
||||
return( FALSE );
|
||||
#else
|
||||
QString txt = _dee->encodedData( "lmms/stringpair" );
|
||||
bool accepted = QStringList::split( ',', _allowed_keys ).contains(
|
||||
txt.section( ':', 0, 0 ) );
|
||||
_dee->accept( accepted );
|
||||
return( accepted );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ bbTCO::~bbTCO()
|
||||
|
||||
void bbTCO::movePosition( const midiTime & _pos )
|
||||
{
|
||||
// bb-playlist-entries are always aligned on tact-boundaries
|
||||
// bb-playlist-entries are always aligned at tact-boundaries
|
||||
trackContentObject::movePosition( midiTime( _pos.getTact(), 0 ) );
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ void bbTCO::movePosition( const midiTime & _pos )
|
||||
|
||||
void bbTCO::changeLength( const midiTime & _length )
|
||||
{
|
||||
// the length of bb-playlist-entries is always a multiple of one tact
|
||||
// the length of a bb-playlist-entry is always a multiple of one tact
|
||||
trackContentObject::changeLength( midiTime( _length.getTact(), 0 ) );
|
||||
}
|
||||
|
||||
@@ -298,6 +298,9 @@ bbTrack::bbTrack( trackContainer * _tc )
|
||||
: track( _tc )
|
||||
{
|
||||
getTrackWidget()->setFixedHeight( 32 );
|
||||
// drag'n'drop with bb-tracks only causes troubles (and makes no sense
|
||||
// too), so disable it
|
||||
getTrackWidget()->setAcceptDrops( FALSE );
|
||||
|
||||
csize bbNum = s_bbNums.size();
|
||||
bbInfoStruct bis = { bbNum, "" };
|
||||
@@ -342,7 +345,7 @@ bbTrack::~bbTrack()
|
||||
|
||||
|
||||
|
||||
track::trackTypes bbTrack::trackType( void ) const
|
||||
track::trackTypes bbTrack::type( void ) const
|
||||
{
|
||||
return( BB_TRACK );
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -49,6 +49,7 @@
|
||||
#include "buffer_allocator.h"
|
||||
#include "tooltip.h"
|
||||
#include "audio_port.h"
|
||||
#include "string_pair_drag.h"
|
||||
|
||||
|
||||
|
||||
@@ -130,35 +131,38 @@ void sampleTCO::updateLength( int )
|
||||
|
||||
|
||||
|
||||
void sampleTCO::paintEvent( QPaintEvent * )
|
||||
void sampleTCO::dragEnterEvent( QDragEnterEvent * _dee )
|
||||
{
|
||||
#ifdef QT4
|
||||
QPainter p( this );
|
||||
p.fillRect( rect(), QColor( 0, 64, 255 ) );
|
||||
#else
|
||||
// create pixmap for whole widget
|
||||
QPixmap pm( rect().size() );
|
||||
pm.fill( QColor( 0, 64, 255 ) );
|
||||
// and a painter for it
|
||||
QPainter p( &pm );
|
||||
#endif
|
||||
|
||||
if( getTrack()->muted() )
|
||||
if( stringPairDrag::processDragEnterEvent( _dee,
|
||||
"samplefile,sampledata" ) == FALSE )
|
||||
{
|
||||
p.setPen( QColor( 160, 160, 160 ) );
|
||||
trackContentObject::dragEnterEvent( _dee );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void sampleTCO::dropEvent( QDropEvent * _de )
|
||||
{
|
||||
if( stringPairDrag::decodeKey( _de ) == "samplefile" )
|
||||
{
|
||||
setSampleFile( stringPairDrag::decodeValue( _de ) );
|
||||
_de->accept();
|
||||
}
|
||||
else if( stringPairDrag::decodeKey( _de ) == "sampledata" )
|
||||
{
|
||||
m_sampleBuffer.loadFromBase64(
|
||||
stringPairDrag::decodeValue( _de ) );
|
||||
songEditor::inst()->setModified();
|
||||
updateLength();
|
||||
update();
|
||||
_de->accept();
|
||||
}
|
||||
else
|
||||
{
|
||||
p.setPen( QColor( 0, 0, 128 ) );
|
||||
trackContentObject::dropEvent( _de );
|
||||
}
|
||||
p.drawRect( 0, 0, width(), height() );
|
||||
m_sampleBuffer.drawWaves( p, QRect( 1, 1, tMax( tMin( width() - 3,
|
||||
static_cast<int>( getSampleLength() *
|
||||
pixelsPerTact() / 64 ) ), 1 ),
|
||||
height() - 4 ) );
|
||||
#ifndef QT4
|
||||
bitBlt( this, rect().topLeft(), &pm );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -177,6 +181,49 @@ void sampleTCO::mouseDoubleClickEvent( QMouseEvent * )
|
||||
|
||||
|
||||
|
||||
void sampleTCO::paintEvent( QPaintEvent * )
|
||||
{
|
||||
#ifdef QT4
|
||||
QPainter p( this );
|
||||
#else
|
||||
// create pixmap for whole widget
|
||||
QPixmap pm( size() );
|
||||
// and a painter for it
|
||||
QPainter p( &pm );
|
||||
#endif
|
||||
QPixmap bg = embed::getIconPixmap( "sample_track_bg" );
|
||||
for( Sint16 x = 1; x < width() - 1; x += 10 )
|
||||
{
|
||||
p.drawPixmap( x, 1, bg );
|
||||
}
|
||||
p.setPen( QColor( 0, 0, 0 ) );
|
||||
p.drawRect( 0, 0, width(), height() );
|
||||
if( getTrack()->muted() )
|
||||
{
|
||||
p.setPen( QColor( 128, 128, 128 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
p.setPen( QColor( 64, 224, 160 ) );
|
||||
}
|
||||
QRect r = QRect( 1, 1,
|
||||
tMax( static_cast<int>( getSampleLength() *
|
||||
pixelsPerTact() / 64 ), 1 ), height() - 4 );
|
||||
p.setClipRect( QRect( 1, 1, width() - 2, height() - 2 ) );
|
||||
m_sampleBuffer.drawWaves( p, r );
|
||||
if( r.width() < width() - 1 )
|
||||
{
|
||||
p.drawLine( r.x() + r.width(), r.y() + r.height() / 2,
|
||||
width() - 2, r.y() + r.height() / 2 );
|
||||
}
|
||||
#ifndef QT4
|
||||
bitBlt( this, rect().topLeft(), &pm );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
midiTime sampleTCO::getSampleLength( void ) const
|
||||
{
|
||||
return( static_cast<Sint32>( m_sampleBuffer.frames() /
|
||||
@@ -187,7 +234,8 @@ midiTime sampleTCO::getSampleLength( void ) const
|
||||
|
||||
|
||||
|
||||
void FASTCALL sampleTCO::saveSettings( QDomDocument & _doc, QDomElement & _parent )
|
||||
void FASTCALL sampleTCO::saveSettings( QDomDocument & _doc,
|
||||
QDomElement & _parent )
|
||||
{
|
||||
QDomElement sampletco_de = _doc.createElement( nodeName() );
|
||||
if( _parent.nodeName() == "clipboard" )
|
||||
@@ -312,7 +360,7 @@ sampleTrack::~sampleTrack()
|
||||
|
||||
|
||||
|
||||
track::trackTypes sampleTrack::trackType( void ) const
|
||||
track::trackTypes sampleTrack::type( void ) const
|
||||
{
|
||||
return( SAMPLE_TRACK );
|
||||
}
|
||||
|
||||
@@ -111,6 +111,8 @@ KMultiTabBarInternal::KMultiTabBarInternal(QWidget *parent, Qt::Orientation o):Q
|
||||
box->setFixedHeight(24);
|
||||
setFixedHeight(24);
|
||||
}
|
||||
mainLayout->setMargin( 0 );
|
||||
mainLayout->setSpacing( 0 );
|
||||
addChild(box);
|
||||
setFrameStyle(NoFrame);
|
||||
#ifndef QT4
|
||||
@@ -220,7 +222,6 @@ void KMultiTabBarInternal::resizeEvent(QResizeEvent *ev) {
|
||||
if ( (m_style==KMultiTabBar::KDEV3) ||
|
||||
(m_style==KMultiTabBar::KDEV3ICON) ){
|
||||
box->setGeometry(0,0,width(),height());
|
||||
printf("resizevent\n");
|
||||
int lines=1;
|
||||
int space;
|
||||
int tmp=0;
|
||||
|
||||
@@ -63,6 +63,8 @@ textFloat::textFloat( QWidget * _parent ) :
|
||||
reparent( parentWidget() );
|
||||
resize( 20, 20 );
|
||||
hide();
|
||||
|
||||
setFont( pointSize<8>( font() ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -71,7 +73,7 @@ textFloat::textFloat( QWidget * _parent ) :
|
||||
void textFloat::setTitle( const QString & _title )
|
||||
{
|
||||
m_title = _title;
|
||||
repaint();
|
||||
updateSize();
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +82,7 @@ void textFloat::setTitle( const QString & _title )
|
||||
void textFloat::setText( const QString & _text )
|
||||
{
|
||||
m_text = _text;
|
||||
repaint();
|
||||
updateSize();
|
||||
}
|
||||
|
||||
|
||||
@@ -89,7 +91,7 @@ void textFloat::setText( const QString & _text )
|
||||
void textFloat::setPixmap( const QPixmap & _pixmap )
|
||||
{
|
||||
m_pixmap = _pixmap;
|
||||
repaint();
|
||||
updateSize();
|
||||
}
|
||||
|
||||
|
||||
@@ -105,8 +107,7 @@ void textFloat::reparent( QWidget * _new_parent )
|
||||
|
||||
// Get position and reparent to either top level or dialog
|
||||
//
|
||||
while( _new_parent->parentWidget() && !_new_parent->isTopLevel()
|
||||
&&
|
||||
while( _new_parent->parentWidget() && !_new_parent->isTopLevel() &&
|
||||
#ifdef QT4
|
||||
!_new_parent->windowType() == Qt::Dialog
|
||||
#else
|
||||
@@ -162,7 +163,7 @@ textFloat * textFloat::displayMessage( const QString & _msg, int _timeout,
|
||||
}
|
||||
else
|
||||
{
|
||||
tf->move( 32, mw->height() - 24 - _add_y_margin );
|
||||
tf->move( 32, mw->height() - 28 - _add_y_margin );
|
||||
}
|
||||
tf->setText( _msg );
|
||||
tf->show();
|
||||
@@ -208,27 +209,9 @@ void textFloat::paintEvent( QPaintEvent * _pe )
|
||||
|
||||
p.setFont( pointSize<8>( p.font() ) );
|
||||
|
||||
QFontMetrics metrics( p.fontMetrics() );
|
||||
QRect textBound = metrics.boundingRect( m_text );
|
||||
if( m_title != "" )
|
||||
{
|
||||
QFont f = p.font();
|
||||
f.setBold( TRUE );
|
||||
int title_w = QFontMetrics( f ).boundingRect( m_title ).width();
|
||||
if( title_w > textBound.width() )
|
||||
{
|
||||
textBound.setWidth( textBound.width() + title_w );
|
||||
}
|
||||
textBound.setHeight( textBound.height() * 2 + 10 );
|
||||
}
|
||||
if( m_pixmap.isNull() == FALSE )
|
||||
{
|
||||
textBound.setWidth( textBound.width() + m_pixmap.width() + 10 );
|
||||
}
|
||||
resize( textBound.width() + 5, textBound.height() + 5 );
|
||||
p.drawRect( rect() );
|
||||
|
||||
p.setPen( Qt::black );
|
||||
// p.setPen( Qt::black );
|
||||
// small message?
|
||||
if( m_title == "" )
|
||||
{
|
||||
@@ -263,5 +246,33 @@ void textFloat::mousePressEvent( QMouseEvent * )
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void textFloat::updateSize( void )
|
||||
{
|
||||
QFontMetrics metrics( font() );
|
||||
QRect textBound = metrics.boundingRect( m_text );
|
||||
if( m_title != "" )
|
||||
{
|
||||
QFont f = font();
|
||||
f.setBold( TRUE );
|
||||
int title_w = QFontMetrics( f ).boundingRect( m_title ).width();
|
||||
if( title_w > textBound.width() )
|
||||
{
|
||||
textBound.setWidth( title_w );
|
||||
}
|
||||
textBound.setHeight( textBound.height() * 2 + 14 );
|
||||
}
|
||||
if( m_pixmap.isNull() == FALSE )
|
||||
{
|
||||
textBound.setWidth( textBound.width() + m_pixmap.width() + 10 );
|
||||
}
|
||||
resize( textBound.width() + 5, textBound.height() + 5 );
|
||||
//move( QPoint( parentWidget()->width() + 5, 5 ) );
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#undef setParent
|
||||
|
||||
|
||||
Reference in New Issue
Block a user