📄 aslider.cpp
字号:
/********************************************************************** Audacity: A Digital Audio Editor ASlider.cpp Dominic Mazzoni This class is a custom slider, allowing for a slicker look and feel by allowing you to use images for the slider background and the thumb.**********************************************************************/#include <math.h>#include <wx/defs.h>#include <wx/dcclient.h>#include <wx/dcmemory.h>#include <wx/image.h>#include <wx/msgdlg.h>#include <wx/panel.h>#include <wx/tooltip.h>#include <wx/debug.h>#include <wx/textctrl.h>#include <wx/valtext.h>#include <wx/dialog.h>#include <wx/sizer.h>#include <wx/button.h>#include <wx/statline.h>#include <wx/sizer.h>#if defined(__WXMSW__) && !defined(__CYGWIN__)#define USE_POPUPWIN 1#endif#if USE_POPUPWIN#include <wx/popupwin.h>#endif#include "ASlider.h"#include "../AColor.h"#include "../ImageManipulation.h"#include "../Project.h"#include "../../images/SliderThumb.xpm"#include <iostream>#if defined __WXMSW__const int sliderFontSize = 10;#elseconst int sliderFontSize = 12;#endif//// TipPanel//#if USE_POPUPWINclass TipPanel : public wxPopupWindow#elseclass TipPanel : public wxPanel#endif{ public: TipPanel(wxWindow * parent, wxWindowID id, wxString label, const wxPoint &pos); void SetPos(const wxPoint &pos); void OnPaint(wxPaintEvent & event); wxString label; wxString origLabel; wxWindow *mParent; DECLARE_EVENT_TABLE()};#if USE_POPUPWINBEGIN_EVENT_TABLE(TipPanel, wxPopupWindow) EVT_PAINT(TipPanel::OnPaint)END_EVENT_TABLE()TipPanel::TipPanel(wxWindow *parent, wxWindowID id, wxString label, const wxPoint &pos): wxPopupWindow(parent){ this->label = label; this->origLabel = label; mParent = parent; SetPos(pos);}void TipPanel::SetPos(const wxPoint& pos){ int x = pos.x; int y = pos.y; if (mParent) mParent->ClientToScreen(&x,&y); wxClientDC dc(this); wxFont labelFont(sliderFontSize, wxSWISS, wxNORMAL, wxNORMAL); dc.SetFont(labelFont); int width, height; dc.GetTextExtent(origLabel, &width, &height); height += 4; SetSize(x - width/2, y, width, height);}#elseBEGIN_EVENT_TABLE(TipPanel, wxPanel) EVT_PAINT(TipPanel::OnPaint)END_EVENT_TABLE()TipPanel::TipPanel(wxWindow *parent, wxWindowID id, wxString label, const wxPoint &pos): wxPanel(parent, id){ this->label = label; this->origLabel = label; SetPos(pos);}void TipPanel::SetPos(const wxPoint& pos){ wxClientDC dc(this); wxFont labelFont(sliderFontSize, wxSWISS, wxNORMAL, wxNORMAL); dc.SetFont(labelFont); int width, height; dc.GetTextExtent(origLabel, &width, &height); width += 4; height += 4; int left = pos.x - width/2; if (left < 0) left = 0; SetSize(left, pos.y, width, height); }#endifvoid TipPanel::OnPaint(wxPaintEvent& event){ wxPaintDC dc(this); int width, height, textWidth, textHeight; wxFont labelFont(sliderFontSize, wxSWISS, wxNORMAL, wxNORMAL); dc.SetFont(labelFont); GetClientSize(&width, &height); dc.SetPen(*wxBLACK_PEN); dc.SetBrush(AColor::tooltipBrush); dc.DrawRectangle(0, 0, width, height); dc.GetTextExtent(label, &textWidth, &textHeight); dc.DrawText(label, (width-textWidth)/2, (height-textHeight)/2);}//////SliderDialog///#define ID_SLIDER 10000BEGIN_EVENT_TABLE(SliderDialog, wxDialog) EVT_COMMAND(ID_SLIDER,wxEVT_COMMAND_SLIDER_UPDATED,SliderDialog::OnSlider) EVT_TEXT_ENTER(SLIDER_DIALOG_TEXTCTRL,SliderDialog::OnEnter) EVT_TEXT(SLIDER_DIALOG_TEXTCTRL,SliderDialog::OnKeyEvent)END_EVENT_TABLE() ;SliderDialog::SliderDialog(wxWindow * parent, wxWindowID id, const wxString & title, wxPoint position, wxSize size, int style, float value): wxDialog(NULL,id,title,position){ wxBeginBusyCursor(); //Use a vertical sizer wxBoxSizer * vs = new wxBoxSizer(wxVERTICAL); //Add the text wxString * dummy = new wxString(wxString::Format(wxT("%2.2f"),value)); mTextCtrl = new wxTextCtrl(this,SLIDER_DIALOG_TEXTCTRL,*dummy, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER, wxTextValidator(wxFILTER_NUMERIC,dummy)); vs->Add(mTextCtrl,0,wxEXPAND|wxALL,5); //Add a slider mSlider = new ASlider(this,ID_SLIDER,title,wxDefaultPosition,size,style); vs->Add(mSlider,wxEXPAND|wxLEFT|wxRIGHT, 5 ); //Create buttons vs->Add(CreateStdDialogButtonSizer(wxOK|wxCANCEL),0,wxEXPAND|wxALL,5); //lay it out SetAutoLayout(true); SetSizer(vs); vs->SetSizeHints(this); vs->Fit(this); mTextCtrl->SetSelection(-1,-1); mTextCtrl->SetFocus(); mSlider->Set(value); wxEndBusyCursor();}SliderDialog::~SliderDialog(){ delete mSlider; delete mTextCtrl;}void SliderDialog::OnSlider(wxCommandEvent & event){ mTextCtrl->SetValue(wxString::Format(wxT("%2.2f"),mSlider->Get())); event.Skip(false);}void SliderDialog::OnKeyEvent(wxCommandEvent & event){ //Do not do anything here right now. Possibly, better rounding //and validation could go here.}void SliderDialog::OnEnter(wxCommandEvent & event){ wxString text = mTextCtrl->GetValue(); //Convert to a double double val=0; text.ToDouble(&val); //Set the slider to the value. mSlider->Set(val); //Set the text value to the slider's mTextCtrl->SetValue(wxString::Format(wxT("%2.2f"),mSlider->Get())); OnOK(event);}float SliderDialog:: Get(){ return mSlider->Get();}//// LWSlider//// Construct customizable sliderLWSlider::LWSlider(wxWindow * parent, wxString name, const wxPoint &pos, const wxSize &size, float minValue, float maxValue, float stepValue, bool canUseShift, int style, bool heavyweight /* = false */ ){ Init(parent, name, pos, size, minValue, maxValue, stepValue, canUseShift, style, heavyweight);}// Construct predefined sliderLWSlider::LWSlider(wxWindow *parent, wxString name, const wxPoint &pos, const wxSize &size, int style, bool heavyweight /* = false */){ wxString leftLabel, rightLabel; float minValue, maxValue, stepValue; switch(style) { case PAN_SLIDER: minValue = -1.0f; maxValue = +1.0f; stepValue = 0.1f; break; case DB_SLIDER: minValue = -36.0f; maxValue = 36.0f; stepValue = 3.0f; break; case FRAC_SLIDER: minValue = 0.0f; maxValue = 1.0f; stepValue = STEP_CONTINUOUS; break; case SPEED_SLIDER: minValue = 0.0f; maxValue = 3.0f; stepValue = STEP_CONTINUOUS; break; default: minValue = 0.0f; maxValue = 1.0f; stepValue = 0.0f; wxASSERT(false); // undefined style } Init(parent, name, pos, size, minValue, maxValue, stepValue, true, style, heavyweight);}void LWSlider::Init(wxWindow * parent, wxString name, const wxPoint &pos, const wxSize &size, float minValue, float maxValue, float stepValue, bool canUseShift, int style, bool heavyweight /* = false */ ){ mName = name; mStyle = style; mIsDragging = false; mWidth = size.x; mHeight = size.y; mParent = parent; mHW = heavyweight; mID = -1; mMinValue = minValue; mMaxValue = maxValue; mStepValue = stepValue; mCanUseShift = canUseShift; mCurrentValue = 0.0f; if (!(mWidth & 0)) mWidth--; mCenterY = mHeight - 9; wxMemoryDC *dc = new wxMemoryDC(); wxBitmap *bitmap = new wxBitmap(8, 8); dc->SelectObject(*bitmap); AColor::Medium(dc, false); wxColour bkgnd = dc->GetPen().GetColour(); AColor::Medium(dc, true); wxColour selBkgnd = dc->GetPen().GetColour(); wxImage *backgroundImage = CreateSysBackground(mWidth, mHeight, 0, bkgnd);#if wxCHECK_VERSION(2, 5, 0) wxBitmap backgroundBitmap(backgroundImage);#else wxBitmap backgroundBitmap = backgroundImage->ConvertToBitmap();#endif wxImage *thumbImage = new wxImage(wxBitmap(SliderThumb).ConvertToImage()); wxImage *thumb1 = ChangeImageColour(thumbImage, bkgnd); wxImage *thumb2 = ChangeImageColour(thumbImage, selBkgnd); mThumbBitmap = new wxBitmap(thumb1); mSelThumbBitmap = new wxBitmap(thumb2); delete thumb1; delete thumb2; delete thumbImage; delete dc; delete bitmap; mThumbWidth = mThumbBitmap->GetWidth(); mThumbHeight = mThumbBitmap->GetHeight(); mLeftX = mThumbWidth/2; mRightX = mWidth - mThumbWidth/2 - 1; mWidthX = mRightX - mLeftX; int i; for(i=0; i<2; i++) { wxBitmap *bitmap; bitmap = new wxBitmap(mWidth, mHeight); wxMemoryDC *dc = new wxMemoryDC(); dc->SelectObject(*bitmap); if (mHW) { dc->DrawBitmap(backgroundBitmap, 0, 0); } else { AColor::Medium(dc, i==1); dc->DrawRectangle(0, 0, mWidth, mHeight); } AColor::Medium(dc, i==1); dc->DrawLine(mLeftX, mCenterY, mRightX+2, mCenterY); AColor::Dark(dc, false); dc->DrawLine(mLeftX, mCenterY+1, mRightX+2, mCenterY+1); int divs = 10; double upp = divs / (double)(mWidthX-1); double d = 0; int int_d = -1; for(int p=0; p<=mWidthX; p++) { if (((int)d) > int_d) { int_d = (int)d; int ht = (int_d==0 || int_d==divs? 5: 3); AColor::Light(dc, false); dc->DrawLine(mLeftX+p, mCenterY-ht, mLeftX+p, mCenterY); AColor::Dark(dc, false); dc->DrawLine(mLeftX+p+1, mCenterY-ht+1, mLeftX+p+1, mCenterY); } d += upp; } if (style == PAN_SLIDER) { wxFont labelFont(sliderFontSize, wxSWISS, wxNORMAL, wxNORMAL); dc->SetFont(labelFont); /* i18n-hint: One-letter abbreviation for Left, in the Pan slider */ dc->DrawText(_("L"), mLeftX, 1); /* i18n-hint: One-letter abbreviation for Right, in the Pan slider */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -