This commit is contained in:
fgerlits 2006-11-07 16:43:34 +00:00
parent b286b9048d
commit a94d747628
7 changed files with 340 additions and 233 deletions

View File

@ -264,7 +264,7 @@ class Button : public Gtk::Button
* @param child the widget that should be displayed inside the button.
* @param buttonImages the images of the button
*/
Button(Gtk::Widget * child,
Button(Gtk::Widget & child,
Ptr<ButtonImages>::Ref buttonImages) throw ();
/**

View File

@ -228,7 +228,22 @@ class WidgetFactory :
std::logic_error);
/**
* Create and return a button.
* Create and return a generic button.
* It is the reponsibility of the caller to dispose of the created
* object properly.
*
* @param label the label shown inside the button.
* @param type the type of the button to create
* @return a button with the specified label.
*/
Button *
createButton(
Gtk::Widget & label,
WidgetConstants::ButtonType type = WidgetConstants::pushButton)
throw ();
/**
* Create and return a button with a text label.
* It is the reponsibility of the caller to dispose of the created
* object properly.
*

View File

@ -78,7 +78,7 @@ Button :: Button(const Glib::ustring & label,
/*------------------------------------------------------------------------------
* Constructor.
*----------------------------------------------------------------------------*/
Button :: Button(Gtk::Widget * child,
Button :: Button(Gtk::Widget & child,
Ptr<ButtonImages>::Ref buttonImages)
throw ()
: useSelected(false),
@ -88,7 +88,7 @@ Button :: Button(Gtk::Widget * child,
state = passiveState;
this->child = Gtk::manage(child);
this->child = &child;
this->child->set_parent(*this);
}

View File

@ -401,7 +401,39 @@ WidgetFactory :: loadImage(const std::string imageName)
/*------------------------------------------------------------------------------
* Create a button
* Create a generic button.
*----------------------------------------------------------------------------*/
Button *
WidgetFactory :: createButton(Gtk::Widget & label,
WidgetConstants::ButtonType type) throw ()
{
Button * button = 0;
switch (type) {
case WidgetConstants::pushButton:
button = new Button(label, buttonImages);
break;
case WidgetConstants::radioButton:
button = new Button(label, buttonImages);
button->setUseSelected(true);
break;
case WidgetConstants::tabButton:
button = new Button(label, tabButtonImages);
button->setUseSelected(true);
break;
default:
break;
}
return button;
}
/*------------------------------------------------------------------------------
* Create a text button.
*----------------------------------------------------------------------------*/
Button *
WidgetFactory :: createButton(const Glib::ustring & label,

View File

@ -74,16 +74,6 @@ const std::string searchWhereRemoteKey = "searchWhereRemote";
*----------------------------------------------------------------------------*/
const int searchResultsSize = 10;
/*------------------------------------------------------------------------------
* The label for the Backward button.
*----------------------------------------------------------------------------*/
const Glib::ustring backwardButtonText = "";
/*------------------------------------------------------------------------------
* The label for the Forward button.
*----------------------------------------------------------------------------*/
const Glib::ustring forwardButtonText = "";
}
/* =============================================== local function prototypes */
@ -383,21 +373,39 @@ SearchWindow :: constructSearchResultsView(void) throw ()
resultsWindow->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
resultsWindow->add(*searchResultsTreeView);
// create the page backward and forward buttons
backwardButton = Gtk::manage(wf->createButton(backwardButtonText));
forwardButton = Gtk::manage(wf->createButton(forwardButtonText));
// create the paging toolbar
try {
backwardButton = Gtk::manage(wf->createButton(
*getResourceUstring("backwardButtonLabel")));
forwardButton = Gtk::manage(wf->createButton(
*getResourceUstring("forwardButtonLabel")));
} catch (std::invalid_argument &e) {
std::cerr << e.what() << std::endl;
std::exit(1);
}
backwardButton->signal_clicked().connect(sigc::mem_fun(*this,
&SearchWindow::onBackwardButtonClicked));
forwardButton->signal_clicked().connect(sigc::mem_fun(*this,
&SearchWindow::onForwardButtonClicked));
updateBackwardAndForwardButtons();
Gtk::Box * pagingButtonBox = Gtk::manage(new Gtk::HButtonBox(
Gtk::BUTTONBOX_DEFAULT_STYLE, 5));
pagingButtonBox->add(*backwardButton);
pagingButtonBox->add(*forwardButton);
searchResultsCountLabel = Gtk::manage(new Gtk::Label());
Gtk::Box * pagingToolbar = Gtk::manage(new Gtk::HBox);
pagingToolbar->pack_start(*searchResultsCountLabel,
Gtk::PACK_EXPAND_WIDGET, 5);
pagingToolbar->pack_start(*pagingButtonBox, Gtk::PACK_SHRINK, 5);
updatePagingToolbar();
// pack everything in a box
Gtk::Box * view = Gtk::manage(new Gtk::VBox);
view->pack_start(*backwardButton, Gtk::PACK_SHRINK, 2);
view->pack_start(*pagingToolbar, Gtk::PACK_SHRINK, 5);
view->pack_start(*resultsWindow, Gtk::PACK_EXPAND_WIDGET, 0);
view->pack_start(*forwardButton, Gtk::PACK_SHRINK, 2);
return view;
}
@ -539,7 +547,7 @@ SearchWindow :: displaySearchResults(
{
treeModel->clear();
searchResultsTreeView->set_model(treeModel);
updateBackwardAndForwardButtons();
updatePagingToolbar();
Ptr<WidgetFactory>::Ref widgetFactory = WidgetFactory::getInstance();
@ -1088,7 +1096,7 @@ SearchWindow :: onSearchWhereChanged(void) throw ()
searchResultsTreeView->set_model(remoteSearchResults);
}
updateBackwardAndForwardButtons();
updatePagingToolbar();
}
@ -1264,18 +1272,48 @@ SearchWindow :: onForwardButtonClicked(void) throw ()
* Enable or disable the Backward and Forward buttons.
*----------------------------------------------------------------------------*/
void
SearchWindow :: updateBackwardAndForwardButtons(void) throw ()
SearchWindow :: updatePagingToolbar(void) throw ()
{
Ptr<SearchCriteria>::Ref criteria = getSearchCriteria();
if (criteria) {
int offset = criteria->getOffset();
int count = getSearchResultsCount();
int offset = criteria->getOffset();
int count = getSearchResultsCount();
int lastNumber = std::min(offset + getSearchResultsSize(), count);
try {
if (count > 0) {
searchResultsCountLabel->set_text(*formatMessage(
"searchResultsCountLabel",
itoa(offset + 1),
itoa(lastNumber),
itoa(count) ));
} else {
searchResultsCountLabel->set_text("");
}
} catch (std::invalid_argument &e) {
std::cerr << e.what() << std::endl;
std::exit(1);
}
backwardButton->setDisabled(offset == 0);
forwardButton->setDisabled(offset + getSearchResultsSize() >= count);
} else {
searchResultsCountLabel->set_text("");
backwardButton->setDisabled(true);
forwardButton->setDisabled(true);
}
}
/*------------------------------------------------------------------------------
* Convert an integer to a string.
*----------------------------------------------------------------------------*/
Glib::ustring
SearchWindow :: itoa(int number) throw ()
{
std::ostringstream stream;
stream << number;
Glib::ustring string = stream.str();
return string;
}

View File

@ -149,6 +149,51 @@ class SearchWindow : public GuiWindow
*/
Ptr<ExportPlaylistWindow>::Ref exportPlaylistWindow;
/**
* The tree model, as a GTK reference, for the local search results.
*/
Glib::RefPtr<Gtk::ListStore> localSearchResults;
/**
* The tree model, as a GTK reference, for the remote search results.
*/
Glib::RefPtr<Gtk::ListStore> remoteSearchResults;
/**
* The tree view showing the search results.
*/
ZebraTreeView * searchResultsTreeView;
/**
* The label showing the number of search results.
*/
Gtk::Label * searchResultsCountLabel;
/**
* The notebook for the various tabs in the window.
*/
ScrolledNotebook * searchInput;
/**
* The transport token used when a remote search is pending.
*/
Ptr<const Glib::ustring>::Ref remoteSearchToken;
/**
* The pop-up context menu for local audio clips.
*/
Gtk::Menu * audioClipContextMenu;
/**
* The pop-up context menu for local playlists.
*/
Gtk::Menu * playlistContextMenu;
/**
* The pop-up context menu for remote audio clips and playlists.
*/
Gtk::Menu * remoteContextMenu;
/**
* Construct the "search where" box.
* This contains a combo box, where the user can choose between
@ -230,51 +275,6 @@ class SearchWindow : public GuiWindow
Gtk::Menu *
constructRemoteContextMenu(void) throw ();
/**
* Event handler for the simple Search button getting clicked.
*/
void
onSimpleSearch(void) throw ();
/**
* Event handler for the advanced Search button getting clicked.
*/
void
onAdvancedSearch(void) throw ();
/**
* Event handler for changed selection in the Browse view.
*/
void
onBrowse(void) throw ();
/**
* Do the searching (first set of results).
* Sets the offset to 0, and calls onSearch().
*
* @param criteria the search criteria.
*/
void
onInitialSearch(Ptr<SearchCriteria>::Ref criteria) throw ();
/**
* Do the searching (after paging backward or forward).
* Sets the offset to the given value, and calls onSearch().
*
* @param offset the new offset to use for this search.
*/
void
onContinuedSearch(int offset) throw ();
/**
* Do the searching.
* Calls either localSearch() or remoteSearch().
*
* @param criteria the search criteria.
*/
void
onSearch(Ptr<SearchCriteria>::Ref criteria) throw ();
/**
* Check the status of the "search where" input box.
*/
@ -359,103 +359,65 @@ class SearchWindow : public GuiWindow
throw ();
/**
* Enable or disable the Backward and Forward buttons.
* Update the paging portion of the search results view.
* Prints the number of results, and enables or disables
* the Backward and Forward buttons.
*/
void
updateBackwardAndForwardButtons(void) throw ();
updatePagingToolbar(void) throw ();
/**
* Signal handler for the mouse clicked on one of the entries.
* Display a (usually error) message in the search results tree view.
*
* @param event the button event received
* @param messageKey the localization key for the message.
* @param treeModel the tree model to display the message in.
*/
void
onEntryClicked(GdkEventButton * event) throw ();
displayMessage(const Glib::ustring & messageKey,
Glib::RefPtr<Gtk::ListStore> treeModel)
throw ();
/**
* Signal handler for the user double-clicking, or pressing Enter
* on one of the entries.
* Display an error message which occurred during a search.
*
* @param event the button event recieved
* @param error the error which occurred.
* @param treeModel the tree model to display the message in.
*/
void
onDoubleClick(const Gtk::TreeModel::Path & path,
const Gtk::TreeViewColumn * column)
displayError(const XmlRpcException & error,
Glib::RefPtr<Gtk::ListStore> treeModel)
throw ();
/**
* Display an error message which occurred during a local search.
*
* @param error the error which occurred.
*/
void
displayLocalSearchError(const XmlRpcException & error)
throw ();
/**
* Display an error message which occurred during a remote search.
*
* @param error the error which occurred.
*/
void
displayRemoteSearchError(const XmlRpcException & error)
throw ();
/**
* Add a playable to the scratchpad.
*/
void
onAddToScratchpad(void) throw ();
/**
* Signal handler for the "add to playlist" menu item selected from
* the entry context menu.
*/
virtual void
onAddToPlaylist(void) throw ();
/**
* Add a playable to the live mode.
*/
void
onAddToLiveMode(void) throw ();
/**
* Signal handler for the "edit playlist" menu item selected from
* the entry context menu.
*/
virtual void
onEditPlaylist(void) throw ();
/**
* Signal handler for the "schedule playlist" menu item selected
* from the entry context menu.
*/
virtual void
onSchedulePlaylist(void) throw ();
/**
* Signal handler for the "export playlist" menu item selected from
* the entry context menu.
*/
void
onExportPlaylist(void) throw ();
/**
* Signal handler for "upload to hub" in the context menu.
*/
void
onUploadToHub(void) throw ();
/**
* Signal handler for "download from hub" in the context menu.
*/
void
onDownloadFromHub(void) throw ();
/**
* Event handler for a click on the Backward button.
*/
void
onBackwardButtonClicked(void) throw ();
/**
* Event handler for a click on the Forward button.
*/
void
onForwardButtonClicked(void) throw ();
/**
* Event handler called when the the window gets hidden.
* Convert an integer to a string.
*
* This overrides GuiWindow::on_hide(), and closes the Export Playlist
* window, if it is still open.
* @param number the number to be converted.
* @return the string value of the number (in base 10).
*/
virtual void
on_hide(void) throw ();
static Glib::ustring
itoa(int number) throw ();
protected:
/**
* The columns model needed by Gtk::TreeView.
* Lists one clip per row.
@ -510,86 +472,6 @@ class SearchWindow : public GuiWindow
*/
ModelColumns modelColumns;
/**
* The tree model, as a GTK reference, for the local search results.
*/
Glib::RefPtr<Gtk::ListStore> localSearchResults;
/**
* The tree model, as a GTK reference, for the remote search results.
*/
Glib::RefPtr<Gtk::ListStore> remoteSearchResults;
/**
* The tree view showing the search results.
*/
ZebraTreeView * searchResultsTreeView;
/**
* The notebook for the various tabs in the window.
*/
ScrolledNotebook * searchInput;
/**
* The transport token used when a remote search is pending.
*/
Ptr<const Glib::ustring>::Ref remoteSearchToken;
/**
* The pop-up context menu for local audio clips.
*/
Gtk::Menu * audioClipContextMenu;
/**
* The pop-up context menu for local playlists.
*/
Gtk::Menu * playlistContextMenu;
/**
* The pop-up context menu for remote audio clips and playlists.
*/
Gtk::Menu * remoteContextMenu;
/**
* Display a (usually error) message in the search results tree view.
*
* @param messageKey the localization key for the message.
* @param treeModel the tree model to display the message in.
*/
void
displayMessage(const Glib::ustring & messageKey,
Glib::RefPtr<Gtk::ListStore> treeModel)
throw ();
/**
* Display an error message which occurred during a search.
*
* @param error the error which occurred.
* @param treeModel the tree model to display the message in.
*/
void
displayError(const XmlRpcException & error,
Glib::RefPtr<Gtk::ListStore> treeModel)
throw ();
/**
* Display an error message which occurred during a local search.
*
* @param error the error which occurred.
*/
void
displayLocalSearchError(const XmlRpcException & error)
throw ();
/**
* Display an error message which occurred during a remote search.
*
* @param error the error which occurred.
*/
void
displayRemoteSearchError(const XmlRpcException & error)
throw ();
/**
* Return the number of search results which can be displayed.
* As currently implemented, this returns a constant 10.
@ -600,6 +482,143 @@ class SearchWindow : public GuiWindow
int
getSearchResultsSize(void) throw ();
/**
* Event handler for the simple Search button getting clicked.
*/
void
onSimpleSearch(void) throw ();
/**
* Event handler for the advanced Search button getting clicked.
*/
void
onAdvancedSearch(void) throw ();
/**
* Event handler for changed selection in the Browse view.
*/
void
onBrowse(void) throw ();
/**
* Do the searching (first set of results).
* Sets the offset to 0, and calls onSearch().
*
* @param criteria the search criteria.
*/
void
onInitialSearch(Ptr<SearchCriteria>::Ref criteria) throw ();
/**
* Do the searching (after paging backward or forward).
* Sets the offset to the given value, and calls onSearch().
*
* @param offset the new offset to use for this search.
*/
void
onContinuedSearch(int offset) throw ();
/**
* Do the searching.
* Calls either localSearch() or remoteSearch().
*
* @param criteria the search criteria.
*/
void
onSearch(Ptr<SearchCriteria>::Ref criteria) throw ();
/**
* Signal handler for the mouse clicked on one of the entries.
*
* @param event the button event received
*/
void
onEntryClicked(GdkEventButton * event) throw ();
/**
* Signal handler for the user double-clicking, or pressing Enter
* on one of the entries.
*
* @param event the button event recieved
*/
void
onDoubleClick(const Gtk::TreeModel::Path & path,
const Gtk::TreeViewColumn * column)
throw ();
/**
* Add a playable to the scratchpad.
*/
void
onAddToScratchpad(void) throw ();
/**
* Signal handler for the "add to playlist" menu item selected from
* the entry context menu.
*/
void
onAddToPlaylist(void) throw ();
/**
* Add a playable to the live mode.
*/
void
onAddToLiveMode(void) throw ();
/**
* Signal handler for the "edit playlist" menu item selected from
* the entry context menu.
*/
void
onEditPlaylist(void) throw ();
/**
* Signal handler for the "schedule playlist" menu item selected
* from the entry context menu.
*/
void
onSchedulePlaylist(void) throw ();
/**
* Signal handler for the "export playlist" menu item selected from
* the entry context menu.
*/
void
onExportPlaylist(void) throw ();
/**
* Signal handler for "upload to hub" in the context menu.
*/
void
onUploadToHub(void) throw ();
/**
* Signal handler for "download from hub" in the context menu.
*/
void
onDownloadFromHub(void) throw ();
/**
* Event handler for a click on the Backward button.
*/
void
onBackwardButtonClicked(void) throw ();
/**
* Event handler for a click on the Forward button.
*/
void
onForwardButtonClicked(void) throw ();
/**
* Event handler called when the the window gets hidden.
*
* This overrides GuiWindow::on_hide(), and closes the Export Playlist
* window, if it is still open.
*/
virtual void
on_hide(void) throw ();
public:

View File

@ -200,6 +200,9 @@ root:table
transportsTab:string { "Transfers" }
searchButtonLabel:string { "Search" }
backwardButtonLabel:string { "⇦ Previous" }
forwardButtonLabel:string { "Next ⇨" }
searchResultsCountLabel:string { "{0}-{1} of {2} results" }
typeColumnLabel:string { "Type" }
titleColumnLabel:string { "Title" }