436 lines
14 KiB
C++
436 lines
14 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: taskbarbutton.cpp
|
|
// Purpose: wxTaskBarButton sample
|
|
// Author: Chaobin Zhang <zhchbin@gmail.com>
|
|
// Created: 2014-04-30
|
|
// Copyright: (c) 2014 wxWidgets development team
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/progdlg.h"
|
|
#include "wx/wx.h"
|
|
#endif
|
|
|
|
#include "wx/stdpaths.h"
|
|
#include "wx/taskbarbutton.h"
|
|
|
|
enum
|
|
{
|
|
ProgressValueSlider = wxID_HIGHEST,
|
|
VisibilityRadio,
|
|
ThumbnailTooltipSetBtn,
|
|
ProgressStateChoice,
|
|
SetOverlayIconBtn,
|
|
ClearOverlayIconBtn,
|
|
SetThumbnailClipBtn,
|
|
RestoreThumbnailClipBtn,
|
|
AddThumbBarButtonBtn,
|
|
RemoveThumbBarButtonBtn,
|
|
};
|
|
|
|
enum
|
|
{
|
|
ThumbnailToolbarBtn_0 = wxID_HIGHEST + 100,
|
|
ThumbnailToolbarBtn_1,
|
|
ThumbnailToolbarBtn_2,
|
|
ThumbnailToolbarBtn_3,
|
|
ThumbnailToolbarBtn_4,
|
|
ThumbnailToolbarBtn_5,
|
|
ThumbnailToolbarBtn_6
|
|
};
|
|
|
|
namespace {
|
|
|
|
wxBitmap CreateBitmap(const wxColour& colour, int w, int h)
|
|
{
|
|
wxMemoryDC dc;
|
|
wxBitmap bmp(w, h);
|
|
dc.SelectObject(bmp);
|
|
|
|
// Draw transparent background
|
|
wxColour magic(255, 0, 255);
|
|
wxBrush magicBrush(magic);
|
|
dc.SetBrush(magicBrush);
|
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
|
dc.DrawRectangle(0, 0, w, h);
|
|
|
|
// Draw image content
|
|
dc.SetBrush(wxBrush(colour));
|
|
dc.DrawCircle(h / 2, h / 2 + 1, h / 2);
|
|
dc.SelectObject(wxNullBitmap);
|
|
|
|
// Finalize transparency with a mask
|
|
wxMask *mask = new wxMask(bmp, magic);
|
|
bmp.SetMask(mask);
|
|
return bmp;
|
|
}
|
|
|
|
wxIcon CreateRandomIcon()
|
|
{
|
|
static int counter = 0;
|
|
static const wxColour* colours[] =
|
|
{
|
|
wxBLACK,
|
|
wxWHITE,
|
|
wxRED,
|
|
wxBLUE,
|
|
wxGREEN,
|
|
wxCYAN,
|
|
wxLIGHT_GREY
|
|
};
|
|
|
|
wxIcon icon;
|
|
icon.CopyFromBitmap(CreateBitmap(*(colours[counter]), 16, 16));
|
|
counter += 1;
|
|
counter = counter % WXSIZEOF(colours);
|
|
return icon;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
class MyApp : public wxApp
|
|
{
|
|
public:
|
|
virtual bool OnInit() wxOVERRIDE;
|
|
};
|
|
|
|
class MyFrame : public wxFrame
|
|
{
|
|
public:
|
|
MyFrame(const wxString& title);
|
|
|
|
private:
|
|
wxDECLARE_EVENT_TABLE();
|
|
|
|
void OnSetProgressValue(wxScrollEvent& WXUNUSED(event));
|
|
void OnVisibilityChange(wxCommandEvent& WXUNUSED(event));
|
|
void OnSetThumbnailTooltipBtn(wxCommandEvent& WXUNUSED(event));
|
|
void OnChoice(wxCommandEvent& event);
|
|
void OnSetOverlayIcon(wxCommandEvent& WXUNUSED(event));
|
|
void OnClearOverlayIcon(wxCommandEvent& WXUNUSED(event));
|
|
void OnSetOrRestoreThumbnailClip(wxCommandEvent& event);
|
|
void OnAddThubmBarButton(wxCommandEvent& WXUNUSED(event));
|
|
void OnRemoveThubmBarButton(wxCommandEvent& WXUNUSED(event));
|
|
void OnThumbnailToolbarBtnClicked(wxCommandEvent& event);
|
|
|
|
wxSlider *m_slider;
|
|
wxRadioBox *m_visibilityRadioBox;
|
|
wxTextCtrl *m_textCtrl;
|
|
wxChoice *m_stateChoice;
|
|
|
|
typedef wxVector<wxThumbBarButton*> wxThumbBarButtons;
|
|
wxThumbBarButtons m_thumbBarButtons;
|
|
};
|
|
|
|
wxIMPLEMENT_APP(MyApp);
|
|
|
|
bool MyApp::OnInit()
|
|
{
|
|
if ( !wxApp::OnInit() )
|
|
return false;
|
|
|
|
wxTaskBarJumpList jumpList;
|
|
wxTaskBarJumpListItem *item1 = new wxTaskBarJumpListItem(
|
|
NULL,
|
|
wxTASKBAR_JUMP_LIST_TASK,
|
|
"Task 1",
|
|
wxStandardPaths::Get().GetExecutablePath(),
|
|
wxEmptyString,
|
|
"Test Task",
|
|
wxStandardPaths::Get().GetExecutablePath(),
|
|
0);
|
|
wxTaskBarJumpListItem *item2 = new wxTaskBarJumpListItem(
|
|
NULL,
|
|
wxTASKBAR_JUMP_LIST_TASK,
|
|
"Task 2",
|
|
wxStandardPaths::Get().GetExecutablePath(),
|
|
wxEmptyString,
|
|
"Test Task",
|
|
wxStandardPaths::Get().GetExecutablePath(),
|
|
0);
|
|
jumpList.GetTasks().Append(item1);
|
|
jumpList.GetTasks().Append(
|
|
new wxTaskBarJumpListItem(NULL, wxTASKBAR_JUMP_LIST_SEPARATOR));
|
|
jumpList.GetTasks().Append(item2);
|
|
jumpList.ShowRecentCategory();
|
|
jumpList.ShowFrequentCategory();
|
|
|
|
wxTaskBarJumpListCategory* customCategory =
|
|
new wxTaskBarJumpListCategory(&jumpList, "Custom");
|
|
wxTaskBarJumpListItem* item3 = new wxTaskBarJumpListItem(
|
|
customCategory,
|
|
wxTASKBAR_JUMP_LIST_DESTINATION,
|
|
"Help",
|
|
wxStandardPaths::Get().GetExecutablePath(),
|
|
"--help",
|
|
"wxTaskBarButton help.",
|
|
wxStandardPaths::Get().GetExecutablePath(),
|
|
0);
|
|
customCategory->Append(item3);
|
|
jumpList.AddCustomCategory(customCategory);
|
|
|
|
const wxTaskBarJumpListCategory& frequentCategory =
|
|
jumpList.GetFrequentCategory();
|
|
const wxTaskBarJumpListItems& frequentItems = frequentCategory.GetItems();
|
|
for ( size_t i = 0; i < frequentItems.size(); ++i )
|
|
{
|
|
wxLogMessage(frequentItems[i]->GetFilePath());
|
|
}
|
|
|
|
const wxTaskBarJumpListCategory& recentCategory =
|
|
jumpList.GetRecentCategory();
|
|
const wxTaskBarJumpListItems& recentItems = recentCategory.GetItems();
|
|
for ( size_t i = 0; i < recentItems.size(); ++i )
|
|
{
|
|
wxLogMessage(recentItems[i]->GetFilePath());
|
|
}
|
|
|
|
MyFrame *frame = new MyFrame("wxTaskBarButton App");
|
|
if ( !frame->MSWGetTaskBarButton() )
|
|
{
|
|
wxLogError("Task bar button API is not available on this system, sorry.");
|
|
return false;
|
|
}
|
|
|
|
frame->Show(true);
|
|
|
|
return true;
|
|
}
|
|
|
|
MyFrame::MyFrame(const wxString& title)
|
|
: wxFrame(NULL, wxID_ANY, title)
|
|
{
|
|
wxPanel *panel = new wxPanel(this);
|
|
wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
|
|
wxFlexGridSizer *gs = new wxFlexGridSizer(4, 2, 10, 10);
|
|
|
|
// SetProgressValue section.
|
|
wxStaticBoxSizer *spvSizer =
|
|
new wxStaticBoxSizer(wxVERTICAL, panel, "SetProgressValue");
|
|
int flags = wxSL_MIN_MAX_LABELS | wxSL_VALUE_LABEL | wxSL_AUTOTICKS;
|
|
m_slider = new wxSlider(spvSizer->GetStaticBox(), ProgressValueSlider,
|
|
0, 0, 100,
|
|
wxDefaultPosition, wxSize(250, -1),
|
|
flags);
|
|
m_slider->SetTickFreq(10);
|
|
spvSizer->Add(m_slider);
|
|
|
|
// Show/Hide in Taskbar section.
|
|
const wxString labels[] =
|
|
{
|
|
"&Show in Taskbar",
|
|
"&Hide in Taskbar"
|
|
};
|
|
m_visibilityRadioBox = new wxRadioBox(panel, VisibilityRadio, "Visibility:",
|
|
wxDefaultPosition, wxDefaultSize,
|
|
WXSIZEOF(labels), labels,
|
|
1, wxRA_SPECIFY_ROWS);
|
|
// SetThumbnailTooltip section.
|
|
wxStaticBoxSizer *sttSizer =
|
|
new wxStaticBoxSizer(wxVERTICAL, panel, "SetThumbnailTooltip");
|
|
m_textCtrl = new wxTextCtrl(panel, wxID_ANY);
|
|
wxButton *btn = new wxButton(panel, ThumbnailTooltipSetBtn, "Set");
|
|
sttSizer->Add(m_textCtrl, 1, wxEXPAND | wxALL, 2);
|
|
sttSizer->Add(btn, 1, wxEXPAND | wxALL, 2);
|
|
|
|
// SetProgressState section.
|
|
wxStaticBoxSizer *spsSizer =
|
|
new wxStaticBoxSizer(wxVERTICAL, panel, "SetProgressState");
|
|
const wxString choices[] =
|
|
{
|
|
"wxNoProgress",
|
|
"wxIndeterminate",
|
|
"wxNormal",
|
|
"wxError",
|
|
"wxPaused"
|
|
};
|
|
m_stateChoice = new wxChoice(panel, ProgressStateChoice,
|
|
wxDefaultPosition, wxDefaultSize,
|
|
WXSIZEOF(choices), choices);
|
|
spsSizer->Add(m_stateChoice, 0, wxALL | wxGROW, 5);
|
|
|
|
// SetOverlayIcon section.
|
|
wxStaticBoxSizer *soiSizer =
|
|
new wxStaticBoxSizer(wxVERTICAL, panel, "SetOverlayIcon");
|
|
wxButton *setOverlayIconBtn =
|
|
new wxButton(panel, SetOverlayIconBtn, "Set Overlay Icon");
|
|
wxButton *clearOverlayIconBtn =
|
|
new wxButton(panel, ClearOverlayIconBtn, "Clear Overlay Icon");
|
|
soiSizer->Add(setOverlayIconBtn, 1, wxEXPAND | wxALL, 2);
|
|
soiSizer->Add(clearOverlayIconBtn, 1, wxEXPAND | wxALL, 2);
|
|
|
|
// SetThumbnailClip section.
|
|
wxStaticBoxSizer *stcSizer =
|
|
new wxStaticBoxSizer(wxVERTICAL, panel, "SetThumbnailClip");
|
|
wxButton *setThumbnailClipBtn =
|
|
new wxButton(panel, SetThumbnailClipBtn, "Set Thumbnail Clip");
|
|
wxButton *restoreThumbnailClipBtn =
|
|
new wxButton(panel, RestoreThumbnailClipBtn,
|
|
"Restore Thumbnail Clip");
|
|
stcSizer->Add(setThumbnailClipBtn, 1, wxEXPAND | wxALL, 2);
|
|
stcSizer->Add(restoreThumbnailClipBtn, 1, wxEXPAND | wxALL, 2);
|
|
|
|
// Thumbnail Toolbar Buttons section.
|
|
wxStaticBoxSizer *ttbSizer =
|
|
new wxStaticBoxSizer(wxVERTICAL, panel, "ThumbBar Buttons");
|
|
wxButton *addThumbBarButtonBtn =
|
|
new wxButton(panel, AddThumbBarButtonBtn, "Add ThumbBar Button");
|
|
wxButton *showThumbnailToolbarBtn =
|
|
new wxButton(panel, RemoveThumbBarButtonBtn,
|
|
"Remove Last ThumbBar Button");
|
|
ttbSizer->Add(addThumbBarButtonBtn, 1, wxEXPAND | wxALL, 2);
|
|
ttbSizer->Add(showThumbnailToolbarBtn, 1, wxEXPAND | wxALL, 2);
|
|
|
|
gs->Add(spvSizer, 0, wxEXPAND);
|
|
gs->Add(m_visibilityRadioBox, 0, wxEXPAND);
|
|
gs->Add(sttSizer, 0, wxEXPAND);
|
|
gs->Add(spsSizer, 0, wxEXPAND);
|
|
gs->Add(soiSizer, 0, wxEXPAND);
|
|
gs->Add(stcSizer, 0, wxEXPAND);
|
|
gs->Add(ttbSizer, 0, wxEXPAND);
|
|
|
|
wxStaticText *text = new wxStaticText(
|
|
panel, wxID_ANY, "Welcome to wxTaskBarButton sample");
|
|
mainSizer->Add(text, 0, wxALIGN_CENTRE_HORIZONTAL);
|
|
mainSizer->Add(gs);
|
|
|
|
panel->SetSizer(mainSizer);
|
|
|
|
SetIcon(wxICON(sample));
|
|
SetSize(537, 420);
|
|
Centre();
|
|
}
|
|
|
|
wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
|
EVT_COMMAND_SCROLL(ProgressValueSlider, MyFrame::OnSetProgressValue)
|
|
EVT_RADIOBOX(VisibilityRadio, MyFrame::OnVisibilityChange)
|
|
EVT_BUTTON(ThumbnailTooltipSetBtn, MyFrame::OnSetThumbnailTooltipBtn)
|
|
EVT_CHOICE(ProgressStateChoice, MyFrame::OnChoice)
|
|
EVT_BUTTON(SetOverlayIconBtn, MyFrame::OnSetOverlayIcon)
|
|
EVT_BUTTON(ClearOverlayIconBtn, MyFrame::OnClearOverlayIcon)
|
|
EVT_BUTTON(SetThumbnailClipBtn, MyFrame::OnSetOrRestoreThumbnailClip)
|
|
EVT_BUTTON(RestoreThumbnailClipBtn, MyFrame::OnSetOrRestoreThumbnailClip)
|
|
EVT_BUTTON(AddThumbBarButtonBtn, MyFrame::OnAddThubmBarButton)
|
|
EVT_BUTTON(RemoveThumbBarButtonBtn, MyFrame::OnRemoveThubmBarButton)
|
|
EVT_BUTTON(ThumbnailToolbarBtn_0, MyFrame::OnThumbnailToolbarBtnClicked)
|
|
EVT_BUTTON(ThumbnailToolbarBtn_1, MyFrame::OnThumbnailToolbarBtnClicked)
|
|
EVT_BUTTON(ThumbnailToolbarBtn_2, MyFrame::OnThumbnailToolbarBtnClicked)
|
|
EVT_BUTTON(ThumbnailToolbarBtn_3, MyFrame::OnThumbnailToolbarBtnClicked)
|
|
EVT_BUTTON(ThumbnailToolbarBtn_4, MyFrame::OnThumbnailToolbarBtnClicked)
|
|
EVT_BUTTON(ThumbnailToolbarBtn_5, MyFrame::OnThumbnailToolbarBtnClicked)
|
|
EVT_BUTTON(ThumbnailToolbarBtn_6, MyFrame::OnThumbnailToolbarBtnClicked)
|
|
wxEND_EVENT_TABLE()
|
|
|
|
void MyFrame::OnSetProgressValue(wxScrollEvent& WXUNUSED(event))
|
|
{
|
|
static bool s_hasRangeSet = false;
|
|
if ( !s_hasRangeSet )
|
|
{
|
|
MSWGetTaskBarButton()->SetProgressRange(100);
|
|
s_hasRangeSet = true;
|
|
}
|
|
|
|
MSWGetTaskBarButton()->SetProgressValue(m_slider->GetValue());
|
|
}
|
|
|
|
void MyFrame::OnVisibilityChange(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
if ( m_visibilityRadioBox->GetSelection() == 0 )
|
|
MSWGetTaskBarButton()->Show();
|
|
else
|
|
MSWGetTaskBarButton()->Hide();
|
|
}
|
|
|
|
void MyFrame::OnSetThumbnailTooltipBtn(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
MSWGetTaskBarButton()->SetThumbnailTooltip(m_textCtrl->GetLineText(0));
|
|
}
|
|
|
|
void MyFrame::OnChoice(wxCommandEvent& event)
|
|
{
|
|
int sel = event.GetSelection();
|
|
wxTaskBarButtonState state;
|
|
switch(sel)
|
|
{
|
|
case 0:
|
|
state = wxTASKBAR_BUTTON_NO_PROGRESS;
|
|
break;
|
|
case 1:
|
|
state = wxTASKBAR_BUTTON_INDETERMINATE;
|
|
break;
|
|
case 2:
|
|
state = wxTASKBAR_BUTTON_NORMAL;
|
|
break;
|
|
case 3:
|
|
state = wxTASKBAR_BUTTON_ERROR;
|
|
break;
|
|
case 4:
|
|
state = wxTASKBAR_BUTTON_PAUSED;
|
|
break;
|
|
default:
|
|
state = wxTASKBAR_BUTTON_NO_PROGRESS;
|
|
break;
|
|
}
|
|
|
|
MSWGetTaskBarButton()->SetProgressValue(m_slider->GetValue());
|
|
MSWGetTaskBarButton()->SetProgressState(state);
|
|
}
|
|
|
|
void MyFrame::OnSetOverlayIcon(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
MSWGetTaskBarButton()->SetOverlayIcon(CreateRandomIcon());
|
|
}
|
|
|
|
void MyFrame::OnClearOverlayIcon(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
MSWGetTaskBarButton()->SetOverlayIcon(wxNullIcon);
|
|
}
|
|
|
|
void MyFrame::OnSetOrRestoreThumbnailClip(wxCommandEvent& event)
|
|
{
|
|
wxRect rect;
|
|
if ( event.GetId() == SetThumbnailClipBtn )
|
|
{
|
|
static const int CLIP_LENGTH = 100;
|
|
int height, width;
|
|
GetClientSize(&width, &height);
|
|
rect.SetX((width - CLIP_LENGTH) / 2);
|
|
rect.SetY((height - CLIP_LENGTH) / 2);
|
|
rect.SetHeight(CLIP_LENGTH);
|
|
rect.SetWidth(CLIP_LENGTH);
|
|
}
|
|
|
|
MSWGetTaskBarButton()->SetThumbnailClip(rect);
|
|
}
|
|
|
|
void MyFrame::OnAddThubmBarButton(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
if ( m_thumbBarButtons.size() >= 7 )
|
|
return;
|
|
|
|
wxThumbBarButton *button =
|
|
new wxThumbBarButton(m_thumbBarButtons.size() + ThumbnailToolbarBtn_0 ,
|
|
CreateRandomIcon());
|
|
MSWGetTaskBarButton()->AppendThumbBarButton(button);
|
|
m_thumbBarButtons.push_back(button);
|
|
}
|
|
|
|
void MyFrame::OnRemoveThubmBarButton(wxCommandEvent& WXUNUSED(event))
|
|
{
|
|
if ( m_thumbBarButtons.empty() )
|
|
return;
|
|
|
|
wxThumbBarButton* button = m_thumbBarButtons.back();
|
|
m_thumbBarButtons.pop_back();
|
|
delete MSWGetTaskBarButton()->RemoveThumbBarButton(button);
|
|
}
|
|
|
|
void MyFrame::OnThumbnailToolbarBtnClicked(wxCommandEvent& event)
|
|
{
|
|
wxLogMessage("Thumbnail Toolbar Button %d is clicked.", event.GetId());
|
|
}
|