// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*- /* * Copyright (C) 2011-2012 Canonical Ltd * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authored by: Jason Smith */ #ifndef SWITCHERMODEL_H #define SWITCHERMODEL_H #include #include "AbstractLauncherIcon.h" #include "LauncherModel.h" #include "unity-shared/Introspectable.h" #include namespace unity { namespace switcher { /** * Provides a list of applications and application windows for the Switcher. * * This model provides a model two-level iterable data structure. The first * level of data is effectively a list of applications available for selection. * Each application can further provide a second-level collection of windows for * selection. To this end, the model provides the notion of the current * iterator value within each list, the second iterator value modally * corresponding to the current iterator value of the first. * * The mode of this model is changed by toggling the @p detail_selection * property. Different iteration calls need to be made by client code depending * on the state of that property. */ class SwitcherModel : public debug::Introspectable, public sigc::trackable { public: typedef std::shared_ptr Ptr; typedef std::vector Applications; typedef Applications::iterator iterator; typedef Applications::reverse_iterator reverse_iterator; nux::Property detail_selection; nux::Property detail_selection_index; nux::Property only_apps_on_viewport; SwitcherModel(Applications const&, bool sort_by_priority); virtual ~SwitcherModel() = default; iterator begin(); iterator end(); reverse_iterator rbegin(); reverse_iterator rend(); launcher::AbstractLauncherIcon::Ptr at(unsigned int index) const; void AddIcon(launcher::AbstractLauncherIcon::Ptr const&); void RemoveIcon(launcher::AbstractLauncherIcon::Ptr const&); size_t Size() const; launcher::AbstractLauncherIcon::Ptr Selection() const; int SelectionIndex() const; bool SelectionIsActive() const; launcher::AbstractLauncherIcon::Ptr LastSelection() const; int LastSelectionIndex() const; std::vector SelectionWindows() const; std::vector const& DetailXids() const; Window DetailSelectionWindow() const; void Next(); void Prev(); void NextDetail(); void PrevDetail(); void NextDetailRow(); void PrevDetailRow(); bool HasNextDetailRow() const; bool HasPrevDetailRow() const; void SetRowSizes(std::vector const& row_sizes); void Select(launcher::AbstractLauncherIcon::Ptr const& selection); void Select(unsigned int index); sigc::signal selection_changed; sigc::signal updated; protected: // Introspectable methods std::string GetName() const override; void AddProperties(debug::IntrospectionData&) override; debug::Introspectable::IntrospectableList GetIntrospectableChildren() override; private: void UpdateRowIndex(); unsigned int SumNRows(unsigned int n) const; bool DetailIndexInLeftHalfOfRow() const; void InsertIcon(launcher::AbstractLauncherIcon::Ptr const&); void ConnectToIconSignals(launcher::AbstractLauncherIcon::Ptr const&); void VerifyApplications(); void UpdateLastActiveApplication(); void UpdateDetailXids(); void OnIconQuirksChanged(); void OnIconWindowsUpdated(launcher::AbstractLauncherIcon*); void UnsetDetailSelection(); void NextIndex(); void PrevIndex(); Applications applications_; Applications hidden_applications_; bool sort_by_priority_; unsigned int index_; unsigned int last_index_; unsigned int row_index_; launcher::AbstractLauncherIcon::Ptr last_active_application_; std::vector row_sizes_; std::vector detail_xids_; }; } } #endif // SWITCHERMODEL_H