← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 3272: plugin commands can have an icon

 

------------------------------------------------------------
revno: 3272
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Tue 2013-04-23 19:41:14 +0200
message:
  plugin commands can have an icon
modified:
  dcpp/PluginApiImpl.cpp
  dcpp/PluginApiImpl.h
  dcpp/PluginDefs.h
  dcpp/PluginManager.cpp
  dcpp/PluginManager.h
  win32/MainWindow.cpp
  win32/MainWindow.h
  win32/PluginApiWin.cpp
  win32/PluginApiWin.h


--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'dcpp/PluginApiImpl.cpp'
--- dcpp/PluginApiImpl.cpp	2013-03-03 19:19:41 +0000
+++ dcpp/PluginApiImpl.cpp	2013-04-23 17:41:14 +0000
@@ -95,7 +95,9 @@
 	&PluginApiImpl::getConfig,
 
 	&PluginApiImpl::copyData,
-	&PluginApiImpl::releaseData
+	&PluginApiImpl::releaseData,
+
+	&PluginApiImpl::getInstallPath
 };
 
 DCLog PluginApiImpl::dcLog = {
@@ -168,9 +170,9 @@
 DCTagger PluginApiImpl::dcTagger = {
 	DCINTF_DCPP_TAGGER_VER,
 
+	&PluginApiImpl::getText,
+
 	&PluginApiImpl::addTag,
-
-	&PluginApiImpl::getText,
 	&PluginApiImpl::replaceText
 };
 
@@ -429,6 +431,12 @@
 	}
 }
 
+ConfigStrPtr DCAPI PluginApiImpl::getInstallPath(const char* guid) {
+	auto str = PluginManager::getInstallPath(guid);
+	ConfigStr value = { CFG_TYPE_STRING, str.c_str() };
+	return reinterpret_cast<ConfigStrPtr>(copyData(reinterpret_cast<ConfigValuePtr>(&value)));
+}
+
 // Functions for DCLog
 void PluginApiImpl::log(const char* msg) {
 	LogManager::getInstance()->message(msg);
@@ -504,14 +512,14 @@
 }
 
 // Functions for DCTagger
+const char* PluginApiImpl::getText(TagDataPtr hTags) {
+	return reinterpret_cast<Tagger*>(hTags->object)->getText().c_str();
+}
+
 void PluginApiImpl::addTag(TagDataPtr hTags, size_t start, size_t end, const char* id, const char* attributes) {
 	reinterpret_cast<Tagger*>(hTags->object)->addTag(start, end, id, attributes);
 }
 
-const char* PluginApiImpl::getText(TagDataPtr hTags) {
-	return reinterpret_cast<Tagger*>(hTags->object)->getText().c_str();
-}
-
 void PluginApiImpl::replaceText(TagDataPtr hTags, size_t start, size_t end, const char* replacement) {
 	reinterpret_cast<Tagger*>(hTags->object)->replaceText(start, end, replacement);
 }

=== modified file 'dcpp/PluginApiImpl.h'
--- dcpp/PluginApiImpl.h	2013-01-29 18:08:36 +0000
+++ dcpp/PluginApiImpl.h	2013-04-23 17:41:14 +0000
@@ -71,6 +71,8 @@
 	static void DCAPI setConfig(const char* guid, const char* setting, ConfigValuePtr val);
 	static ConfigValuePtr DCAPI getConfig(const char* guid, const char* setting, ConfigType type);
 
+	static ConfigStrPtr DCAPI getInstallPath(const char* guid);
+
 	// Functions for DCLog
 	static void DCAPI log(const char* msg);
 
@@ -92,9 +94,9 @@
 	static size_t DCAPI fromBase32(uint8_t* dst, const char* src, size_t n);
 
 	// Functions for DCTagger
+	static const char* DCAPI getText(TagDataPtr hTags);
+
 	static void DCAPI addTag(TagDataPtr hTags, size_t start, size_t end, const char* id, const char* attributes);
-
-	static const char* DCAPI getText(TagDataPtr hTags);
 	static void DCAPI replaceText(TagDataPtr hTags, size_t start, size_t end, const char* replacement);
 
 	// Functions for DCQueue

=== modified file 'dcpp/PluginDefs.h'
--- dcpp/PluginDefs.h	2013-03-03 19:19:41 +0000
+++ dcpp/PluginDefs.h	2013-04-23 17:41:14 +0000
@@ -32,7 +32,7 @@
 #endif
 
 /* Version of the plugin api (must change if old plugins simply can't be seen as viably working) */
-#define DCAPI_CORE_VER				6
+#define DCAPI_CORE_VER				7
 
 #ifdef _WIN32
 # define DCAPI __stdcall
@@ -58,7 +58,7 @@
 
 /* Recommended interfaces */
 #define DCINTF_CONFIG				"generic.plugins.DCConfig"	/* Config management */
-#define DCINTF_CONFIG_VER			1
+#define DCINTF_CONFIG_VER			2
 
 #define DCINTF_LOGGING				"generic.plugins.DCLog"		/* Logging functions */
 #define DCINTF_LOGGING_VER			1
@@ -74,10 +74,10 @@
 #define DCINTF_DCPP_QUEUE_VER		2
 
 #define DCINTF_DCPP_UTILS			"dcpp.utils.DCUtils"		/* Utility and convenience functions */
-#define DCINTF_DCPP_UTILS_VER		2
+#define DCINTF_DCPP_UTILS_VER		1
 
 #define DCINTF_DCPP_TAGGER			"dcpp.xml.DCTagger"			/* Manipulation of an XML tagger */
-#define DCINTF_DCPP_TAGGER_VER		2
+#define DCINTF_DCPP_TAGGER_VER		1
 
 #define DCINTF_DCPP_UI				"dcpp.ui.DCUI"				/* User interface */
 #define DCINTF_DCPP_UI_VER			1
@@ -336,6 +336,9 @@
 
 	ConfigValuePtr		(DCAPI *copy)				(const ConfigValuePtr val);
 	void				(DCAPI *release)			(ConfigValuePtr val);
+
+	/* Version 2 functions */
+	ConfigStrPtr	(DCAPI *get_install_path)	(const char* guid);
 } DCConfig, *DCConfigPtr;
 
 /* Logging functions */
@@ -426,10 +429,9 @@
 	/* Tagger API version */
 	uint32_t apiVersion;
 
+	const char*	(DCAPI *get_text)					(TagDataPtr hTags);
+
 	void		(DCAPI *add_tag)					(TagDataPtr hTags, size_t start, size_t end, const char* id, const char* attributes);
-
-	/* Version 2 functions */
-	const char*	(DCAPI *get_text)					(TagDataPtr hTags);
 	void		(DCAPI *replace_text)				(TagDataPtr hTags, size_t start, size_t end, const char* replacement);
 } DCTagger, *DCTaggerPtr;
 
@@ -440,7 +442,10 @@
 	/* User interface API version */
 	uint32_t apiVersion;
 
-	void		(DCAPI *add_command)				(const char* name, DCCommandFunc command);
+	/* Add a command identified by "name".
+	"icon" is optional; it is the path to an icon file used to illustrate the command. */
+	void		(DCAPI *add_command)				(const char* name, DCCommandFunc command, const char* icon);
+	/* Remove a command previously added with add_command. */
 	void		(DCAPI *remove_command)				(const char* name);
 
 	void		(DCAPI *play_sound)					(const char* path);

=== modified file 'dcpp/PluginManager.cpp'
--- dcpp/PluginManager.cpp	2013-04-23 15:34:45 +0000
+++ dcpp/PluginManager.cpp	2013-04-23 17:41:14 +0000
@@ -167,7 +167,7 @@
 	}
 
 	const auto source = Util::getTempPath() + "dcext" PATH_SEPARATOR_STR;
-	const auto target = Util::getPath(Util::PATH_USER_LOCAL) + "Plugins" PATH_SEPARATOR_STR + uuid + PATH_SEPARATOR_STR;
+	const auto target = getInstallPath(uuid);
 	const auto lib = target + Util::getFileName(plugin);
 
 	File::ensureDirectory(lib);
@@ -531,6 +531,10 @@
 	}
 }
 
+string PluginManager::getInstallPath(const string& uuid) {
+	return Util::getPath(Util::PATH_USER_LOCAL) + "Plugins" PATH_SEPARATOR_STR + uuid + PATH_SEPARATOR_STR;
+}
+
 // Listeners
 void PluginManager::on(ClientManagerListener::ClientConnected, Client* aClient) noexcept {
 	runHook(HOOK_HUB_ONLINE, aClient);

=== modified file 'dcpp/PluginManager.h'
--- dcpp/PluginManager.h	2013-04-23 15:34:45 +0000
+++ dcpp/PluginManager.h	2013-04-23 17:41:14 +0000
@@ -175,6 +175,8 @@
 	const string& getPluginSetting(const string& pluginName, const string& setting);
 	void removePluginSetting(const string& pluginName, const string& setting);
 
+	static string getInstallPath(const string& uuid);
+
 private:
 	void loadSettings() noexcept;
 	void saveSettings() noexcept;

=== modified file 'win32/MainWindow.cpp'
--- win32/MainWindow.cpp	2013-04-22 22:31:37 +0000
+++ win32/MainWindow.cpp	2013-04-23 17:41:14 +0000
@@ -45,6 +45,7 @@
 #include <dcpp/WindowInfo.h>
 
 #include <dwt/Application.h>
+#include <dwt/DWTException.h>
 #include <dwt/widgets/Grid.h>
 #include <dwt/widgets/MessageBox.h>
 #include <dwt/widgets/Notification.h>
@@ -89,7 +90,7 @@
 using dwt::Spinner;
 using dwt::ToolBar;
 
-map<tstring, function<void ()>, noCaseStringLess> MainWindow::pluginCommands;
+decltype(MainWindow::pluginCommands) MainWindow::pluginCommands;
 
 static dwt::IconPtr mainIcon(WinUtil::createIcon(IDI_DCPP, 32));
 static dwt::IconPtr mainSmallIcon(WinUtil::createIcon(IDI_DCPP, 16));
@@ -655,8 +656,8 @@
 	return false;
 }
 
-void MainWindow::addPluginCommand(const tstring& text, function<void ()> command) {
-	pluginCommands[text] = command;
+void MainWindow::addPluginCommand(const tstring& text, function<void ()> command, const tstring& icon) {
+	pluginCommands[text] = make_pair(command, icon);
 
 	if(WinUtil::mainWindow && !WinUtil::mainWindow->closing()) {
 		WinUtil::mainWindow->pluginMenu->clear();
@@ -683,7 +684,12 @@
 		pluginMenu->appendItem(T_("(No plugin command found)"), nullptr, nullptr, false);
 	} else {
 		for(auto& i: pluginCommands) {
-			pluginMenu->appendItem(i.first, i.second);
+			dwt::IconPtr icon;
+			if(!i.second.second.empty()) {
+				try { icon = new dwt::Icon(i.second.second, dwt::Point(16, 16)); }
+				catch(const dwt::DWTException&) { }
+			}
+			pluginMenu->appendItem(i.first, i.second.first, icon);
 		}
 	}
 }

=== modified file 'win32/MainWindow.h'
--- win32/MainWindow.h	2013-04-16 16:11:50 +0000
+++ win32/MainWindow.h	2013-04-23 17:41:14 +0000
@@ -67,7 +67,7 @@
 
 	void handleSettings();
 
-	static void addPluginCommand(const tstring& text, function<void ()> command);
+	static void addPluginCommand(const tstring& text, function<void ()> command, const tstring& icon);
 	static void removePluginCommand(const tstring& text);
 
 	/** show a balloon popup. refer to the dwt::Notification::addMessage doc for info about parameters. */
@@ -138,8 +138,9 @@
 	bool tray_pm;
 
 	/* sorted list of plugin commands. static because they may be added before the window has
-	actually been created. */
-	static map<tstring, function<void ()>, noCaseStringLess> pluginCommands;
+	actually been created.
+	command name -> pair<callback, icon path> */
+	static map<tstring, pair<function<void ()>, tstring>, noCaseStringLess> pluginCommands;
 
 	HttpConnection* conns[CONN_LAST];
 	unique_ptr<File> geo6File, geo4File;

=== modified file 'win32/PluginApiWin.cpp'
--- win32/PluginApiWin.cpp	2013-01-18 21:28:38 +0000
+++ win32/PluginApiWin.cpp	2013-04-23 17:41:14 +0000
@@ -21,6 +21,7 @@
 
 #include <dcpp/PluginManager.h>
 #include <dcpp/Text.h>
+#include <dcpp/Util.h>
 
 #include "MainWindow.h"
 #include "WinUtil.h"
@@ -39,8 +40,8 @@
 }
 
 // Functions for DCUI
-void PluginApiWin::addCommand(const char* name, DCCommandFunc command) {
-	MainWindow::addPluginCommand(Text::toT(name), [=] { command(name); });
+void PluginApiWin::addCommand(const char* name, DCCommandFunc command, const char* icon) {
+	MainWindow::addPluginCommand(Text::toT(name), [=] { command(name); }, icon ? Text::toT(icon) : Util::emptyStringT);
 }
 
 void PluginApiWin::removeCommand(const char* name) {

=== modified file 'win32/PluginApiWin.h'
--- win32/PluginApiWin.h	2013-01-18 21:28:38 +0000
+++ win32/PluginApiWin.h	2013-04-23 17:41:14 +0000
@@ -29,7 +29,7 @@
 
 private:
 	// Functions for DCUI
-	static void DCAPI addCommand(const char* name, DCCommandFunc command);
+	static void DCAPI addCommand(const char* name, DCCommandFunc command, const char* icon);
 	static void DCAPI removeCommand(const char* name);
 
 	static void DCAPI playSound(const char* path);